Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
829 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Bordel mais comment includer proprement ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Bordel mais comment includer proprement ?

n°613107
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 15-01-2004 à 23:15:03  profilanswer
 

Bon alors vala les gens, j'ai un gros souci. J'ai cette structure là :


|
+-classes
|   |
|   +-SuperClasse.php
|   |
|   +-ClasseGeniale.php
|
+-youpi.php


Le truc crétin, quoi.
C'qui se passe, c'est que dans youpi.php, j'ai besoin de SuperClasse. Donc pas d'souci, j'fais include "classes/SuperClasse.php". Or, SuperClasse.php a besoin de ClasseGeniale.php. Donc dans SuperClasse.php, j'ai fait un superbe include "ClasseGeniale.php".
Et là, vlan, viandage :

Citation :


Warning: main(../classes/SuperClasse.php): failed to open stream: No such file or directory in d:\dev\sarace\php\classes\ClasseGenial.php on line 3


En réfléchissant fort, j'me suis dit "oh non". Et j'ai fait :
include "classes/ClasseGeniale.php";
Et là ça marche [:taiche] Enfin, ça trouve bien mes fichiers. J'imagine que c'est passke PHP se situe dans sarace/php et non dans sarace/php/classes au moment où il se tape l'include de ClasseGeniale.php.
Mais moi j'veux PAS foutre mes includes dans la page de base, j'vais pas m'y retrouver pis c'est moche et j'raconte pas les effets de bord [:sisicaivrai]
Donc à part foutre un path absolu dans l'include (chose que je ne veux vraiment pas passke le file system sera différent entre la machine de dev et celle de prod), y a un moyen de faire tourner ça correctement ?
 
Si vous avez pas tout compris, hésitez pas à demander des précisions :D


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
mood
Publicité
Posté le 15-01-2004 à 23:15:03  profilanswer
 

n°613133
mrbebert
Posté le 15-01-2004 à 23:42:09  profilanswer
 

Excellente question : si tu as une idée géniale sur le sujet, n'hésites pas à nous en faire profiter :/  
 
Personnellement, pour un intranet, j'ai pris comme convention que j'étais toujours dans un sous-répertoire de la racine du site. Ainsi, tous les include sont sous la forme "include('../include/script.php');", y compris dans les scripts destiné à être inclus :)  
Ca ne pose pas de problème, pour ceux qui sont à la racine, il suffit de commencer le script par un "chdir('./include/');" [:proy]

n°613149
*syl*
--> []
Posté le 16-01-2004 à 00:12:03  profilanswer
 

Bah c'est simple :
index.php
config.inc.php
classes\ClasseGenial.php
classes\ClasseGenial2.php
 
dans ton config.inc.php qui sera chargé pour chaque page, tu définis une constante (define) avec le répertoire de base et t'utilises cette constante dans tes include

n°613203
gizmo
Posté le 16-01-2004 à 09:09:44  profilanswer
 

Soit tu prens la solutions de syl, soit tu m'expliques en quoi le fait que le le file system soit un problème en soi.

n°613272
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 16-01-2004 à 10:37:33  profilanswer
 

gizmo a écrit :

Soit tu prens la solutions de syl, soit tu m'expliques en quoi le fait que le le file system soit un problème en soi.


Bin j'fais mon dev sous Ouinedoze. La plateforme de prod est un FreeBSD. Donc mettre le path absolu genre E:\youpi\php c'est pas jouable.
Ensuite, j'peux toujours faire des path genre /MonAliasWeb/php/classes ou autre. Mais là encore, mon alias de dev n'est pas le même que l'alias de prod.
Si t'as des suggestions, vas-y, fais-toi plaisir :)
 
Syl : merci ; j'pensais aussi mettre un répertoire dans mon include_path et le modifier de même sur mon serveur de prod... bof mais bon, apparemment y a pas d'autre truc simple.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°613276
gizmo
Posté le 16-01-2004 à 10:42:09  profilanswer
 

Bah le path "absolu" est relatif au root que tu a mis dans apache, pas relatif à la racine de ton disque. et les "slash"/"backslash" sont tous codés "slash" dans php, donc je ne vois pas en quoi ça pose problème.

n°613285
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 16-01-2004 à 10:50:02  profilanswer
 

gizmo a écrit :

Bah le path "absolu" est relatif au root que tu a mis dans apache, pas relatif à la racine de ton disque. et les "slash"/"backslash" sont tous codés "slash" dans php, donc je ne vois pas en quoi ça pose problème.


Bin :
docroot apache Ouinedoze = D:\dev\siteouaibe
docroot apache FreeBSD = /home/users/taiche/siteouaibe
Là, OK. De même, sur mon site de dev et sur le site de prod pendant toute la période de dev, je fais tout le dev dans un sous-répertoire 2.0, ce qui fait que mon site sera accessible par http://serveur/supersite/2.0
Le souci, c'est que si je code du include "/2.0/classes/php" un peu partout, faudra que je vire le "/2.0" pour le jour où je "releaserai" le site. Je veux pu de 2.0 dans mon URL, moi :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°613310
gizmo
Posté le 16-01-2004 à 11:06:35  profilanswer
 

ok, dans ce cas, ce que je fais, c'est à peu près comme *syl*, un fichier config.inc.php, sauf que j'y mets juste une seule variable que j'appelle $rootpath et qui contient le préfixe à rajouter dans mes includes.

n°613316
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 16-01-2004 à 11:12:08  profilanswer
 

Okeille. Bon ba ça va se terminer comme ça ou avec une modif d'include_path, alors :o
En fait, quand on y réfléchit, c'est logique. L'include_path de PHP, c'est un peu le CLASSPATH de Java.
 
Merci à tous pour vos suggestions :jap:


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°614231
ethernal
Chercheur de vérité...
Posté le 17-01-2004 à 01:41:17  profilanswer
 

gizmo a écrit :

ok, dans ce cas, ce que je fais, c'est à peu près comme *syl*, un fichier config.inc.php, sauf que j'y mets juste une seule variable que j'appelle $rootpath et qui contient le préfixe à rajouter dans mes includes.


c'est dangeureux de mettre une variable $rootpath... (voir z0glub)
thread : http://forum.hardware.fr/forum2.ph [...] 0&subcat=0
 
Utilise les constantes.

mood
Publicité
Posté le 17-01-2004 à 01:41:17  profilanswer
 

n°614262
blackphant​om
Pfffff...
Posté le 17-01-2004 à 05:09:13  profilanswer
 

moi je me suis fait des fonctions qui vont chercher toutes seules dans kelle repertoire est telle ou telle fichier a inclure. Tant que je ne change pas les arborescence de mon site, quelque soit l'endroit ou mon script de base se trouve, les fichiers inclus necessaires sont trouvés. Pour cela, je me base sur un repertoire de base : webArea.
 
Voici des exemples :
 
 
 
function getDir() {
 
  if (!defined("LOCAL_DIR" )) {
    define("LOCAL_DIR", getcwd());
  }
 
  return LOCAL_DIR;
}
 
function getwebAreaDir() {
 
  if (!isset($_SESSION['WEBAREA_DIR'])) {
    $tabA = explode("webArea", getDir());
    $_SESSION['WEBAREA_DIR'] = $tabA[0] . "webArea/";
  }
  return $_SESSION['WEBAREA_DIR'];
}
 
function getCommonDir() {
 
  if (!isset($_SESSION['COMMON_DIR'])) {
 
    $dir1 = getwebAreaDir();
    $dir2 = "../PROD_inc/";
    $_SESSION['COMMON_DIR'] = $dir1 . $dir2;
  }
   
  return $_SESSION['COMMON_DIR'];
}

n°614263
blackphant​om
Pfffff...
Posté le 17-01-2004 à 05:12:02  profilanswer
 

En utilisant la fonction getCommonDir qui utilise les 2 premieres fonctions, je peux inclure n'importe kel fichier de mon repertoire PROD_inc.

n°614264
the real m​oins moins
Posté le 17-01-2004 à 05:50:29  profilanswer
 

et qu'est-ce que COMMON_DIR fout dans les sessions :heink:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°614338
gizmo
Posté le 17-01-2004 à 12:45:59  profilanswer
 

ethernal a écrit :


c'est dangeureux de mettre une variable $rootpath... (voir z0glub)
thread : http://forum.hardware.fr/forum2.ph [...] 0&subcat=0
 
Utilise les constantes.


En fait, j'utilise des classes, mais c'était pour expliquer le principe.

n°614389
blackphant​om
Pfffff...
Posté le 17-01-2004 à 15:58:57  profilanswer
 

the real moins moins a écrit :

et qu'est-ce que COMMON_DIR fout dans les sessions :heink:


 
COMMON_DIR est le répertoire absolu de mes fichiers communs (/var/www/common/ par exemple).
 
Si cette variable de session est déjà définie, c'est que la fonction a déjà été exécutée donc pour eviter un autre traitement, la fonction va me retourner $_SESSION['COMMON_DIR'] directement.
 
J'espere avoir repondu a ta question...

n°614508
beboutou
Posté le 17-01-2004 à 19:50:13  profilanswer
 

A mon avis, le plus simple est de rajouter le path de ton rep de classes dans le include_path de PHP. Lorsque l'on défnitit une inclusion relative, PHP regarde d'abord dans le rep courant puis dans tous les rep de l'include_path.
 
Le plus simple reste donc de setter la chemin vers ton rep de classe dans le include_path, comme ca tous tes scripts qui font appellent à tes classes se servent d'un path relatif.
 
include_path peut etre setté en PHP ou se situe dans le httpd.conf de apache
http://fr3.php.net/manual/en/funct [...] e-path.php

n°614763
misterping​uin
Posté le 18-01-2004 à 12:10:59  profilanswer
 

personnellement j'ai arreté les urls relatives a cause de ce problème, et j'utilise $_SERVER['DOCUMENT_ROOT'] de la sorte tu n'as qu'à te soucier de connaitre le chemin de ton fichier à inclure par rapport au document root, et peu importe sur quel serveur tu développes

n°614794
drasche
Posté le 18-01-2004 à 13:53:17  profilanswer
 

perso je fixe une fois pour toutes mes répertoires, pis je référence de manière relative car mon site ne sera pas forcément dans le root du site web (rien que mon site interne est divisé en plusieurs applications distinctes), mais je conserve la même structure au niveau des includes :)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°614870
simogeo
j'ai jamais tué de chats, ...
Posté le 18-01-2004 à 15:43:08  profilanswer
 

misterpinguin a écrit :

personnellement j'ai arreté les urls relatives a cause de ce problème, et j'utilise $_SERVER['DOCUMENT_ROOT'] de la sorte tu n'as qu'à te soucier de connaitre le chemin de ton fichier à inclure par rapport au document root, et peu importe sur quel serveur tu développes


 
je plussoie. Toutefois, ca ne fonctionne pas avec les alias Apache, uniquement avec les VirtualHost


---------------
from here and there -- \o__________________________________ -- la révolution de la terre, en silence
n°1035466
skylight
Made in France.
Posté le 05-04-2005 à 11:24:02  profilanswer
 

Je remonte ce topic car moi je pète un cable avec les includes
 
soit :
mon site se trouve dans un répertoire "toto" a la racine du serveur web
dans toto on va dire que j'ai mysql.inc.php
dans toto, j'ai un répertoire "truc"
dans ce dernier j'ai un script tata.php
si je fais un include("../mysql.inc.php" ); c'est ok, mais  
si je fais include ("/toto/mysql.inc.php" ); c'est pas OK... quelqu'un peut m'expliquer :heink:
 
(le but étant de faire des includes propres dans tout un site, je voudrais utiliser une variable genre "home_dir" qui indique le repertoire de base d'un site web... petage de plomb :D et surtout le but d'avoir un site capable de fonctionner sur plusieurs serveurs différents en modifiant simplement une variable qui indique son repertoire de base sur la racine du serveur
(si je mets mon site sur un serveur, dans un repertoire titi, puis tutu, alors ma variable home_root contiendrai "/titi/tutu/toto/" au lieu de "/toto/"
 


Message édité par skylight le 05-04-2005 à 11:25:41
n°1035471
skylight
Made in France.
Posté le 05-04-2005 à 11:28:02  profilanswer
 

je précise que je bosse sous windows, mais que le serveur est un freebsd.

n°1035476
skylight
Made in France.
Posté le 05-04-2005 à 11:33:14  profilanswer
 

laissez tomber, c'est windows qui est bête.
Il faut simplement dire le chemin depuis la racine du DISQUE dur et non depuis la racine du serveur web...

n°1035491
ratibus
Posté le 05-04-2005 à 11:42:13  profilanswer
 

beboutou a écrit :

A mon avis, le plus simple est de rajouter le path de ton rep de classes dans le include_path de PHP. Lorsque l'on défnitit une inclusion relative, PHP regarde d'abord dans le rep courant puis dans tous les rep de l'include_path.
 
Le plus simple reste donc de setter la chemin vers ton rep de classe dans le include_path, comme ca tous tes scripts qui font appellent à tes classes se servent d'un path relatif.
 
include_path peut etre setté en PHP ou se situe dans le httpd.conf de apache
http://fr3.php.net/manual/en/funct [...] e-path.php

+1
 
Le seul moyen PROPRE de gérer ses includes c'est avec le include_path (en plus on peux l'utiliser pour faire des trucs géniaux comme une surchage de librairies en jouant sur l'ordre des répertoires qu'on met dans le include_path).
 
Toutes les autres méthodes, même si elles marchent, ne sont pas forcément propres.
 
PHP nous propose tout ce qu'il faut pour gérer ça proprement et simplement, autant l'utiliser ;)

n°1035499
ratibus
Posté le 05-04-2005 à 11:47:49  profilanswer
 

skylight a écrit :

laissez tomber, c'est windows qui est bête.
Il faut simplement dire le chemin depuis la racine du DISQUE dur et non depuis la racine du serveur web...

C'est pareil sous les autres système :spamafote:
 
Quand tu fais appel à des fonctions du filesystem, et que le chemin que tu précises est absolu alors c'est par rapport à la racine du filesystem.

n°1035603
skylight
Made in France.
Posté le 05-04-2005 à 12:56:13  profilanswer
 

ratibus a écrit :

+1
 
Le seul moyen PROPRE de gérer ses includes c'est avec le include_path (en plus on peux l'utiliser pour faire des trucs géniaux comme une surchage de librairies en jouant sur l'ordre des répertoires qu'on met dans le include_path).
 
Toutes les autres méthodes, même si elles marchent, ne sont pas forcément propres.
 
PHP nous propose tout ce qu'il faut pour gérer ça proprement et simplement, autant l'utiliser ;)


mais quand tu n'as pas accès a la config serveur ou au htaccess...

n°1035606
Gonzoide
Les cochons... dans l'espâââce
Posté le 05-04-2005 à 12:56:41  profilanswer
 

skylight a écrit :


si je fais include ("/toto/mysql.inc.php" ); c'est pas OK... quelqu'un peut m'expliquer :heink:


 
Le "include" se comporte comme un copier-coller de code ... donc si tu as:
 
./toto.php
./classes/tata.php
./classes/titi.php
 
si dans "toto.php" tu fais un include (classes/tata.php), c'est comme si tata.php se trouvait a la racine ... donc si "tata.php" fait un include (titi.php), ca marchera pas.
 

n°1035608
ratibus
Posté le 05-04-2005 à 12:57:31  profilanswer
 
n°1035616
skylight
Made in France.
Posté le 05-04-2005 à 13:03:02  profilanswer
 

Gonzoide a écrit :

Le "include" se comporte comme un copier-coller de code ... donc si tu as:
 
./toto.php
./classes/tata.php
./classes/titi.php
 
si dans "toto.php" tu fais un include (classes/tata.php), c'est comme si tata.php se trouvait a la racine ... donc si "tata.php" fait un include (titi.php), ca marchera pas.


Ca je sais, merci. D'où mon intérêt aux chemins absolus.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Bordel mais comment includer proprement ?

 

Sujets relatifs
j# - Winsock Bordel j'arrive pas à utiliser la méthode connect :([Temps d'execution] Comment faire proprement?
[PHP] Verifier si $str2 existe dans la chaine plus proprement que cacomment supprimer proprement les doublons d'un tableau d'objet ?
Création, emploi de librairies statiques avec GCC [proprement résolu]Comment afficher un panorama proprement et legerement...
[PERL] Quitter proprement un script[VB] Comment tester proprement la rapidité d'une fonction ?
[devc++] probleme pour includer un .hwidget ? ca veut dire quoi bordel ? :) [resolu]
Plus de sujets relatifs à : Bordel mais comment includer proprement ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR