[PHP5] Bug avec include ?

WRInaute occasionnel
Je dois être fatigué... J'ai des soucis avec mes require_once() ;)

J'ai, à la racine de mon site, un dossier /class (contenant mes classes) et un dossier /data (qui renferme notamment des fichiers .txt contenant une partie de mon contenu).
A la racine de mon site, le fichier /index.php inclut le fichier /class/user.php, qui doit donc appeler /class/db.php. Pour cela, un simple
Code:
require_once 'db.php';
dans le fichier /class/user.php marche très bien. (Donc, le moteur php semple partir du répertoire courant pour faire l'inclusion, et pas du répertoire racine.)

MAIS !

Si dans mon répertoire /class, je veux inclure un fichier du répertoire /data, admettons, /data/config.txt (n'allez pas chercher, je ne stocke pas ma config en txt sur mon serveur ;)),
Code:
require_once '../data/config.txt';
me renvoie une belle erreur, fichier introuvable.

Petit soucis, si j'utilise /data/config.txt , tout marchera bien au niveau racine, mais pas dans le dossier /admin/, puisque les chemins ne seront pas les mêmes. Je ne peux donc pas utiliser simplement mes objets partout: ça casse un peu le délire !
Je ne souhaite pas utiliser de chemins absolus avec $_SERVER['DOCUMENT_ROOT'] (ou autre), je SAIS qu'on peut faire en sorte que le chemin 'de base' de l'include soit celui du script courant (et non de l'appelant), mais je trouve pas dans ma config ce qui peut causer ceci (config tout simplement récupérée sur un serveur du boulot, où tout se passe comme prévu...).

Une idée ?
Merci d'avance, je sèche, et comme d'habitude, ça fait plusieurs heures que je me ruine là-dessus ;)
 
WRInaute occasionnel
Je te garantis que sur les serveurs que j'utilise au travail, pour les sites en php5, c'est bel et bien le script appelant qui détermine le chemin des include et require. C'est un vrai régal pour jongler d'un répertoire à l'autre selon les besoins. Les classes définies dans /class/ sont utilisables partout (racine, admin, sous-répertoires, etc) sans avoir besoin de rajouter de $path.

Actuellement, quand j'ai /class/1.php et /class/2.php, je peux faire
Code:
include '2.php';
dans le fichier 1.php, et l'appeler depuis le répertoire /class/ ou la racine, indépendamment, sans rien toucher.

Note bien que je parle de php5. J'ai remarqué pas mal de gens qui étaient "surpris" par ce nouveau comportement.
 
WRInaute passionné
t'es bien sur d'avoir compris ?

/class/1
/class/2

dans ce cas le script parent est dans le même rep

donc c'est normal que ça marche

rog
 
WRInaute occasionnel
ha oui ok, parent, pardon, je pensais au tout premier de la chaîne (grosse journée, je suis diminué ;))
donc en théorie, tu me confirmes que, à partir de /class/2.php, pour accéder à /data/config.txt, je devrais faire ../data/config.txt ?
Parce que là visiblement ça marche pas, je suis assez surpris, même eclipse me confirme ../data/config.txt, mais je me mange une grosse erreur ligne 1 (celle qui fait mal)
en tout cas merci de tes réponses !
 
WRInaute passionné
ça depend du script parent

celui appelé par le navigateur

/index

/class/1
/class/2
/conf/conf


1er include /class/1 depuis l'index

include(./class/1)

inclusion de class/1 depuis /class/2

include(./class/1)

inclusion de /conf/conf depuis /class/2

include(./conf/conf)

pas mis d'apostrophes mais je pense que tu as compris maintenant

le script parent est /index

donc toutes les inclusions doivent etre renseignées par un chemin relatif à partir de celui-ci

rog
 
WRInaute occasionnel
Bon bah je voudrais pas faire le casse-machins, mais justement.

Il existe une solution pour que ce soit le dernier fichier inclus qui serve de référence, et pas le premier de la chaine.

Parce que dans le cas contraire, dès que tu créées un sous-dossier, tous tes includes sont morts, et tu te retrouves à élaborer des systèmes souvent un peu bancals (bancaux ?) en concaténant des morceaux de path, ou en repartant à chaque fois de Document_Root (et mélanger config serveur et config appli, en général, mieux vaut éviter)

On utilise ça PARTOUT sur les serveurs de mon taff, j'ai la même config, ça devrait marcher pareil !
(je peux te fournir des morceaux de code pour te "prouver" que ça marche, si ça te tente)
 
Nouveau WRInaute
@ Didier_S : je te conseille de lire la doc PHP en ce qui concerne la directive de conf "include_path", tu trouveras l'explication à ton problème ;)

@ rog : je te conseille de lire la doc PHP ... au lieu de créer des expressions comme "monofichier" et de répondre avec un ton hautain !
Et franchement, quand tu as parlé d'index tu m'as fait sourire :) Potasse aussi la doc de ton httpd avec hein ;)
 
WRInaute occasionnel
merci PinkEye, je suis dessus et effectivement, c'est bien de ça dont j'avais besoin.

et j'aurais du me douter que les vrais pros codaient en monofichier pour éviter les problèmes de config apache, et mélangeaient un peu les server-side includes et les appels client ;)
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut