problèmes chemin absolu

ksper
Invité n'ayant pas de compte PHPfrance

23 janv. 2006, 13:21

Bonjour à tous.

Le développement de mon application nécessite le recours aux chemins absolus.
Aussi, après avoir fouiné sur ce forum (très interessant), j'ai trouvé plusieurs méthodes, dont celles-ci:

a)
include($_SERVER['DOCUMENT_ROOT'].'/monfichier.php');
et
b)
include("http://".$_SERVER['HTTP_HOST']."/monfichier.php');

mes questions sont les suivantes:

1) Pourquoi la solution b) ne permet pas des inclusions sur différents niveaux de dossiers?

2) Laquelle de ces solutions vaut il mieux privilégier?

Merci pour vos réponses.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

23 janv. 2006, 14:59

Sans répondre à la question 1 en répondant à la question 2 je dirai sans hésitation que la solution la meilleure est (a) c'est à dire utiliser une inclusion à chemin local renvoyé par $_SERVER['DOCUMENT_ROOT'].

Eneffet, $_SERVER['DOCUMENT_ROOT'] renvoi un chemin local et non HTTP, celà veut dire que l'include va lire à partir du serveur local et non via une reqûete http (solution b) ce qui diminue concidérablement les temps de réponse et donc de l'édition-lien nécéssaire à l'interprétation du code.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ksper
Invité n'ayant pas de compte PHPfrance

23 janv. 2006, 15:03

ok merci pour cette information. je vais donc m'orienter sur cette solution.

Toutefois, faut il prendre certaines précautions pour l'appliquer?

ksper
Invité n'ayant pas de compte PHPfrance

23 janv. 2006, 17:49

je viens d'écrire le code suivant
<?
define('ABS_PATH', $_SERVER['DOCUMENT_ROOT'].'/mon_site');
echo ABS_PATH.'/accueil/accueil.php'; 
?>
et lorsque je le lance (à partir d'easyphp), le lien ne fonctionne pas et j'obtiens le message suivant:
Firefox ne sait pas ouvrir cette adresse car le protocole (c) n'est associé à aucun programme.
le chemin sur mon disque est le suivant

Code : Tout sélectionner

c:/program files/easyphp1-8/www/mon_site/accueil/accueil.php
pourquoi cela ne fonctionne t il pas?

ksper
Invité n'ayant pas de compte PHPfrance

23 janv. 2006, 17:56

En me relisant je viens de m'apercevoir que je n'ai pas écrit le bon script php, il faut lire le code suivant:

<a href="
<? 
define('ABS_PATH', $_SERVER['DOCUMENT_ROOT'].'/mon_site');
echo ABS_PATH.'/accueil/accueil.php'; 
?>
" class="droite_liens">Page d'accueil</a>

et lorsque je le lance (à partir d'easyphp), le lien ne fonctionne pas et j'obtiens le message suivant:
Firefox ne sait pas ouvrir cette adresse car le protocole (c) n'est associé à aucun programme.

le chemin sur mon disque est le suivant

Code : Tout sélectionner

c:/program files/easyphp1-8/www/mon_site/accueil/accueil.php

pourquoi cela ne fonctionne t il pas?

ksper
Invité n'ayant pas de compte PHPfrance

24 janv. 2006, 10:55

Quelqu'un peut il me dire pourquoi les liens utilisant
<a href="
<?
define('ABS_PATH', $_SERVER['DOCUMENT_ROOT'].'/mon_site');
echo ABS_PATH.'/accueil/accueil.php';
?>
" class="droite_liens">Page d'accueil</a>
ne fonctionnent pas?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

24 janv. 2006, 14:58

Ce que tu fais ne correspond pas à ta question de départ.
En effet, tu parlais d'un include (l'instruction) qui s'effectue au niveau du serveur et dans ce cas le chemin d'accès local est prévilègié.

Par contre ton dernier script concerne un lien hypertexte qui s'exécute côté client (navigateur) et à ce moment là le chemin local n'est plus une méthode valide pour reférencer la ressource. Le lien hypertexte (<A href) doit pointer vers un cheimin de type URL HTTP ou FTP.

Résumé:

Quand il s'agit d'un include (édition-lien) exécuté par le serveur web, vaut mieux utiliser un chemin local comme :
include "c:\mon dossier\mon fichier lié";
Mais quand il s'agit de lien hypertexte ou source d'un objet HTML telque <img>, <frame> ou <iframe> etc. On doit spécifier un chemin distant qui mène vers la localité de la ressource liée. Comme:

Code : Tout sélectionner

<A HREF="http://un serveur/la ressource liée">Accèder à la ressource</A> <img src="http://un serveur/fichier de l'image">Une image</img> ou même <img src="un autre fichier d'une autre image">Une autre image</img> (dans ce cas où le mot "http://un serveur" est absent la cible sera automatiquement le serveur de la page en cours (ce qu'on appelle un chemin relatif)
Quoique, si la source d'un lien HTML est un chemin local (ce qui est vrai dans ton dernier exemple) le navigateur ne contacte pas un serveur distant pour obtenir la source mais la recherche sur la machine locale (celle du navigateur) et bien sûr puisque la page web est consultée par des milliards de navigateurs, il est impossible de baser des liens sur des sources locales qui sont supposées être au prélable chez le client.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ksper
Invité n'ayant pas de compte PHPfrance

24 janv. 2006, 15:46

Merci pour ces informations, c'est vrai que ca commençait à ne plus etre vraiment clair.

Cependant, toutes ces remarques sont liées.

Pour résumer, je cherche le moyen d'écrire un chemin absolu pour accéder aux pages internes de mon site tout en autorisant l'inclusion de scripts eux mêmes inclus dans d'autres scripts (ce que ne me permet pas de faire le code suivant)
include("http://".$_SERVER['HTTP_HOST']."/monfichier.php');
pour l'instant, je travaille avec easy php, et j'utilise le code suivant pour écrire des chemins absolus.
define('ABS_PATH','http://127.0.0.1/mon_site');
qui me permet de faire presque tout mais qui m'empeche d'appeler le script de connexion à ma bdd.
include(ABS_PATH.'/dossier1/dossier2/connexion.php');

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

25 janv. 2006, 09:56

Il faut faire attention à la version de PHP que tu utilises car les versions Windows de PHP antérieures à la version 4.3.0 ne supportent pas l'accès aux fichiers distants avec la fonction "include", même si allow_url_fopen est activé dans PHP.INI.

Pour plus d'information voir la partie include de fichiers distant et notamment l'exemple 16-35 ici : http://php.morva.net/manual/fr/function.include.php
où cette remarque est pertinente :
Si les Gestionnaires d'URL sont activés dans PHP (ce qui est le cas par défaut), vous pouvez localiser le fichier avec une URL (via HTTP ou bien avec un gestionnaire adapté : voir Annexe M pour une liste des protocoles), au lieu d'un simple chemin local. Si le serveur distant interprète le fichier comme du code PHP, des variables peuvent être transmises au serveur distant via l'URL et la méthode GET. Ce n'est pas, à strictement parler, la même chose que d'hériter du contexte de variable. Le fichier inclus est en fait un script exécuté à distance, et son résultat est inclus dans le code courant.

Avertissement

Les versions Windows de PHP antérieureus à la version 4.3.0 ne supportent pas l'accès aux fichiers distants avec cette fonction, même si allow_url_fopen est activé.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène