Page 1 sur 2

Include avec chemin relatif

Posté : 16 nov. 2011, 21:51
par Texicitys
Bonjour à tous!

Je suis webmaster d'un site. toute les pages de ce site ont la même structure. tout d'abord il y a l'include connexion.php (pour la bdd), ensuite il y a l'include début.php qui contient le début de la page html et tout les includes (function, constent, etc..).. tous les includes (sauf connexion) se site dans un dossier /include. Connexion se situe dans /connexion.
Les includes function et constant, sont appellé en chemin relatif, vu qu'ils se situe dans le même dossier que debut.php, voici comment je les inclu:
//On inclue les 2 pages restantes
include("functions.php");
include("constants.php");
Vu qu'elle sont dans le meme dossier, je les inclu comme ça.
Que je sois dans la racine, ou dans un autre dossier, il n'y a aucun problème pour les inclure.

Cependant, je voudrais les mettre dans mon fichier connexion.php. Lui se situe dans /connexion/. Je les ai donc inclu comme ça:
include("../include/functions.php");
include("../include/constants.php");
Et quand j'ouvre une page qui se situe dans un dossier (du style /etablissements/ ) la page s'affiche correctement.
Mais quand j'ouvre ma page index.php à la racine j'obtiens se message:

Warning: include(../include/functions.php) [function.include]: failed to open stream: No such file or directory in C:\wamp\www\collaide\connexion\collaidebase.php on line 46

Je ne comprend pas pourquoi ici ça ne joue pas.

Merci de m'aider

Re: Include avec chemin relatif

Posté : 16 nov. 2011, 23:24
par laurents
Il y a visiblement un problème de chemin : peux-tu donner ton arborescence complète (avec notamment les répertoires "connexion" et "include" et la localisation des fichiers connexion.php et debut.php) ?

Re: Include avec chemin relatif

Posté : 16 nov. 2011, 23:49
par Texicitys
Hello!

Le fichier collaidebase.php est dans /connexion/collaidebase.php

Les include c'est /include/constants.php
/include/functions.php
/include/debut.php

Pour le moment, j'include mes deux fichier constant et function depuis le fichier debut, alors le code est le suivant:
include("functions.php");
include("constants.php");

Toutes mes pages inclues collaidebase.php et debut.php (chemin relatif en fonction du lieu de la page en question)

Avec cette methode tout fonctionne très bien!
Si je boot une page à la racine sa fonctionne et si je boot une page dans un dossier, ça fonctionne aussi.

Cependant, je souhaite maintenant include les deux page functions et constants depuis la page collaidebase (au lieu de debut.php). J'ai donc mis le liens relatif suivant dans mon fichier collaidebase:
include("../include/functions.php");
include("../include/constants.php");

Avec cette façon de procéder, si je boot une page qui se situe dans /membres/page.php ça fonctionne.

Cependant, si je boot une page depuis la racine, j'ai le message d'erreur cité plus haut.

Merci d'avance!

Re: Include avec chemin relatif

Posté : 16 nov. 2011, 23:57
par laurents
Effectivement, je crois que pour un fichier situé à la racine, il faudrait faire :

Code : Tout sélectionner

include("include/functions.php"); include("include/constants.php");
(Pour ne pas faire de retour en arrière)

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 00:46
par Texicitys
Merci pour ta réponse!

Cependant, tu n'as pas compris mon problème.. Je sais me servir des chemin relatif.

Pour le moment, tout fonctionne très bien alors que j'inclue sur chaque page (qu'elle soit a la racine ou dans un dossier) mon fichier debut.php. Dans ce fichier il y a écrit:
include("functions.php");
include("constants.php");
Et tout fonctionne avec cette façon de faire..

Je me répète, mais le fichier debut.php ne change pas de contenu en fonction du lieu ou je l'appelle.

Cependant, quand je fais la meme chose mais que j'appelle mes deux include depui le fichier connexion.php. Ca ne fonctionne plus..
Je ne comprends pas du tout pourquoi..

(désolé, c'est très compliqué a expliquer)

Merci

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 01:05
par Texicitys
Sinon, n'y a-t-il pas d'autre meilleur façon pour gérer les include?

Car par chemin absolu je ne peux pas ..

Je viens de voir qu'il existe une fonction include_path mais je n'ai pas trouvé de documentation...

Merci

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 10:05
par moogli

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 10:28
par laurents
Je vais te dire ce que je crois, avoir compris, ce que je crois être le problème, et si c'est bien ça, une solution imaginée :
- le fichier "connexion.php" n'existe pas ; c'est "collaidebase.php"
- toutes tes pages ont le code :

Code : Tout sélectionner

include ("../include/debut.php"); include ("../connexion/collaidebase.php")
ou

Code : Tout sélectionner

include ("include/debut.php"); include ("connexion/collaidebase.php")
(si la page est à la racine)
- le problème que je pense : si une page est à la racine, qd elle inclue les 2 fichiers, elle inclue donc aussi "functions.php" et "constants.php" et si elle est à la racine, elle a donc un chemin relatif qui ne marche pas.
- solution imaginée : il faudrait avoir debut.php, debut_rac.php, collaidebase.php, collaidebase_rac.php
avec debut.php :

Code : Tout sélectionner

include ("../include/functions.php") include ("../include/constants.php") include ("../connexion/commun_debut.php")
debut_rac.php :

Code : Tout sélectionner

include ("include/functions.php") include ("include/constants.php") include ("connexion/commun_debut.php")
collaidebase.php :

Code : Tout sélectionner

include ("../include/functions.php") include ("../include/constants.php") include ("../connexion/commun_collaidebase.php")
et collaidebase_rac.php :

Code : Tout sélectionner

include ("include/functions.php") include ("include/constants.php") include ("connexion/commun_collaidebase.php")
et si un fichier est à la racine, tu y mets :

Code : Tout sélectionner

include ("include/debut_rac.php"); include ("connexion/collaidebase_rac.php")
et sinon : include ("../include/debut.php");
include ("../connexion/collaidebase.php")

Je suis étonné qu'avec "debut.php", ça marche : ça ne devrait pas ; modifier "include_path", ça demande d'avoir accès à "php.ini", ce qui doit être rare (j'oubliai init_set) et de plus, le chemin serait tjs le même...

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 11:02
par Mazarini
///
Je suis étonné qu'avec "debut.php", ça marche : ça ne devrait pas ; modifier "include_path", ça demande d'avoir accès à "php.ini", ce qui doit être rare (j'oubliai init_set) et de plus, le chemin serait tjs le même...
Bonjour,

Il est parfois possible d'utiliser certaines directives PHP dans les fichiers .htacess. Cependant, les hébergeurs ont tendance à définir un répertoire inclus dans l'include_path. Il suffit souvant de le créer dans l'arborescence pour pouvoir l'utiliser.

Pour gérer les includes en chaine, le plus simple est l'utilisation de l'include-path. l'utilisation de liens absolu est pratique, mais implique d'avoir la racine du script à la racine du site ou impose l'arborescence depuis la racine.

une solution alternative est de mettre un chdir('..') en début de script et de mettre tout les liens depuis la racine. ca ne change pas les liens http, uniquement les includes ou les lectures de répertoire.

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 11:22
par laurents
Pourquoi ça :
mais implique d'avoir la racine du script à la racine du site
si le lien est absolu, peu importe où est le script...
une solution alternative est de mettre un chdir('..') en début de script et de mettre tout les liens depuis la racine. ca ne change pas les liens http, uniquement les includes ou les lectures de répertoire.
C'est effectivement une autre solution et du coup, mes fichiers *_rac.php seraient inutiles...

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 11:37
par Mazarini
Pour les liens absolus, tout dépend si tu mets tes scripts dans www.tonsite.com/ ou dans www.tonsite.com/tonapplication/

En fait la différence est surtout gênante lorsque tu a plusieurs sites en local avec localhost/site1... est en production une url par site.

Regardes chez ton hébergeur ce qu'il fournit comme include_path, ca reste la meilleure solution. Chez free.fr et online.fr, il me semble que c'est le répertoire /include qui joue ce role automatiquement. C'est vraiment la solution normale. Pour les tests en local sur ta machine, tu peux utiliser un .htacces à la racine de chaque site pour avoir un include_path spécifique à chaque site.

Re: Include avec chemin relatif

Posté : 17 nov. 2011, 11:45
par laurents
En fait la différence est surtout gênante lorsque tu a plusieurs sites en local avec localhost/site1... est en production une url par site.
Mais qu'est-ce que ça change, qu'on soit en local ou sur serveur, si le lien est absolu :?:

Re: Include avec chemin relatif

Posté : 22 nov. 2011, 01:33
par Texicitys
J'avoue ne pas comprendre pourquoi ça fonctionne actuellement et pas quand je change de dossier...

J'ai bien regardé vos réponses. La meilleur me semble être celle la:

une solution alternative est de mettre un chdir('..') en début de script et de mettre tout les liens depuis la racine. ca ne change pas les liens http, uniquement les includes ou les lectures de répertoire.

Mais je ne comprends pas bien ce que ça veut dire...

Merci d'avance :)

Tex

Re: Include avec chemin relatif

Posté : 22 nov. 2011, 08:07
par moogli
Salut,

En fait le problème est du à l'inclusion des fichiers elle même.

La question à 2 sesterces : est que quand j'inclus un un fichier (d'un sous répertoire) sont chemin "relatif" sera changé ?

Pour répondre à la question :
- un include c'est quoi ?
- que ce passe t il avec un var_dump(basename(__FILE__)); dans le fichier de connexion quand il est inclus ou pas ? (même valeur ou pas).

Voilà z'avez deux heure je ramasse les copies à 9h00 ;)

L'include c'est un copier collé de l'appelé dans l'appelant (pas de résolution de parc etc).
Donc le chemin du script sera celui de l'appelant et non de l'appelé.

C'est une grosse prise de tête quand on ne le gère pas en automatique, voie comme l'indique mazarini avoir le "chroot" des le départ (pourquoi pas en constante) ou avec l'autoload en php5.
La solution de L'include path bien paramétré pour le script étant le plus simple car si ton site déménage tu n'a rien a faire truc est bien foutu ;)

Test ce que j'ai mis tu verra par toi même ;)

@+

Re: Include avec chemin relatif

Posté : 22 nov. 2011, 13:32
par Texicitys
Si ce que tu dis est vrai, pourquoi ça fonctionne avec mon fichier include/debut.php qui inclu lui meme /include/fonctions.php et include/constants.php de cette manière:

include("fonctions.php")

Si je suis ton explication, lorsque je me trouve dans le dossier membres/ et que j'include mon debut.php, ce dernier ne devrai pas trouver mes pages fonctions et contants... Or ça fonctionne peu importe ou je me trouve.

Oui, je vais bien lire tout ce qui concerne l'include path, et je te redis si j'ai des questions :)

Merci beaucoup