[PHP5] Bug avec include ?

Didier_S
WRInaute impliqué
WRInaute impliqué
 
Messages: 567
Inscription: 24 Aoû 2004

[PHP5] Bug avec include ?

Message le Mar Oct 03, 2006 22:25

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: Tout sélectionner
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: Tout sélectionner
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 ;)


rog
WRInaute passionné
WRInaute passionné
 
Messages: 1662
Inscription: 21 Sep 2006

Message le Mar Oct 03, 2006 22:29

c'est le script parent qui determine le chemin relatif

rog

Didier_S
WRInaute impliqué
WRInaute impliqué
 
Messages: 567
Inscription: 24 Aoû 2004

Message le Mar Oct 03, 2006 22:33

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: Tout sélectionner
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.


rog
WRInaute passionné
WRInaute passionné
 
Messages: 1662
Inscription: 21 Sep 2006

Message le Mar Oct 03, 2006 22:38

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

Didier_S
WRInaute impliqué
WRInaute impliqué
 
Messages: 567
Inscription: 24 Aoû 2004

Message le Mar Oct 03, 2006 22:42

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 !


rog
WRInaute passionné
WRInaute passionné
 
Messages: 1662
Inscription: 21 Sep 2006

Message le Mar Oct 03, 2006 22:49

ç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

Didier_S
WRInaute impliqué
WRInaute impliqué
 
Messages: 567
Inscription: 24 Aoû 2004

Message le Mar Oct 03, 2006 22:54

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)


rog
WRInaute passionné
WRInaute passionné
 
Messages: 1662
Inscription: 21 Sep 2006

Message le Mar Oct 03, 2006 23:06

en fait pour moi ça ne sert pas

je code en monofichier

tout est dans l'index

lol

rog

PinkEye
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 1
Inscription: 3 Oct 2006

Message le Mar Oct 03, 2006 23:16

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

Didier_S
WRInaute impliqué
WRInaute impliqué
 
Messages: 567
Inscription: 24 Aoû 2004

Message le Mar Oct 03, 2006 23:19

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


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités