Bordel mais comment includer proprement ?

Bordel mais comment includer proprement ? - PHP - Programmation

Marsh Posté le 15-01-2004 à 23:15:03    

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.
Reply

Marsh Posté le 15-01-2004 à 23:15:03   

Reply

Marsh Posté le 15-01-2004 à 23:42:09    

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]

Reply

Marsh Posté le 16-01-2004 à 00:12:03    

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

Reply

Marsh Posté le 16-01-2004 à 09:09:44    

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.

Reply

Marsh Posté le 16-01-2004 à 10:37:33    

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.
Reply

Marsh Posté le 16-01-2004 à 10:42:09    

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.

Reply

Marsh Posté le 16-01-2004 à 10:50:02    

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.
Reply

Marsh Posté le 16-01-2004 à 11:06:35    

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.

Reply

Marsh Posté le 16-01-2004 à 11:12:08    

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.
Reply

Marsh Posté le 17-01-2004 à 01:41:17    

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.

Reply

Marsh Posté le 17-01-2004 à 01:41:17   

Reply

Marsh Posté le 17-01-2004 à 05:09:13    

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'];
}

Reply

Marsh Posté le 17-01-2004 à 05:12:02    

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

Reply

Marsh Posté le 17-01-2004 à 05:50:29    

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


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 17-01-2004 à 12:45:59    

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.

Reply

Marsh Posté le 17-01-2004 à 15:58:57    

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...

Reply

Marsh Posté le 17-01-2004 à 19:50:13    

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

Reply

Marsh Posté le 18-01-2004 à 12:10:59    

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

Reply

Marsh Posté le 18-01-2004 à 13:53:17    

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)
Reply

Marsh Posté le 18-01-2004 à 15:43:08    

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
Reply

Marsh Posté le 05-04-2005 à 11:24:02    

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
Reply

Marsh Posté le 05-04-2005 à 11:28:02    

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

Reply

Marsh Posté le 05-04-2005 à 11:33:14    

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...

Reply

Marsh Posté le 05-04-2005 à 11:42:13    

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 ;)

Reply

Marsh Posté le 05-04-2005 à 11:47:49    

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.

Reply

Marsh Posté le 05-04-2005 à 12:56:13    

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...

Reply

Marsh Posté le 05-04-2005 à 12:56:41    

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.
 

Reply

Marsh Posté le 05-04-2005 à 12:57:31    

Reply

Marsh Posté le 05-04-2005 à 13:03:02    

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.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed