repertoire de base d'un site web

Petit nouveau ! | 6 Messages

25 oct. 2007, 13:53

Bonjour,

Je viens de commencer mon site en PHP et contrairement à d'habitude la racine du site n'a pas l'air d'être mon repertoire "www" où est installé mon "easyphp" à savoir "D:\perso\EasyPHP1-8\www". En effet j'ai créé une page "accueil.php" dans mon repertoire de base "www" avec un "<? include "/generic/menu.php" ?>" et il ne trouve pas mon fichier "D:\perso\EasyPHP1-8\www\generic\menu.php". J'ai l'erreur suivante :


Warning: main(/generic/menu.php): failed to open stream: No such file or directory in d:\perso\easyphp1-8\www\accueil.php on line 9

Warning: main(): Failed opening '/generic/menu.php' for inclusion (include_path='.;D:\perso\EASYPH~1\\php\pear\') in d:\perso\easyphp1-8\www\accueil.php on line 9

Une idée sur la question ? Je dois definir mon repertoire racine (genre document_root) dans un fichier de conf ? Ce n'est pas fait dans l'instal de base ?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 oct. 2007, 14:11

Lorsque tu fais appel a la fonction include, tu travailles sur le système de fichier (donc en local sur le serveur) et non sur l'url demandée dans le navigateur.

La racine "/" n'a donc pas la même valeur. Dans une url, c'est la racine de ton domaine, mais dans le système de fichier, c'est la racine de ton disque (ici d:\) du coup le fichier ne peut être trouvé.

Tu peux utiliser un chemin relatif au dossier courrant en utilisant "./" ou en ne spécifiant rien.
<?php
  include "generic/menu.php";
// ou bien 
  include "./generic/menu.php";
?>
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

25 oct. 2007, 16:22

effectivement ca fonctionne comme cela avec un chemin relatif.

Ma problematique est que l'include que j'utilise "generic/menu.php" represente le menu de mon site et je suis susceptible de l'appeler partout dans l'arboresence de mon site (par exemple dans magasin/theme1.php). C'est pour cela que j'ai besoin d'un chemin absolu.

Est ce que cela est possible en PHP (comme ca l'est en JSP) ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 oct. 2007, 16:36

Regarde dans ce cas les valeurs disponibles dans $_SERVER (via un phpinfo() par exemple) tu devrais trouver une variable qui correspond à ton besoin.. de mémoire je dirais DOCUMENT_ROOT, à vérifier :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 6 Messages

25 oct. 2007, 17:33

j'ai la variable suivante :
SERVER["DOCUMENT_ROOT"] => d:/perso/easyphp1-8/www

Ca devrait dont marcher non ?

Mammouth du PHP | 2937 Messages

25 oct. 2007, 19:14

Pour construire le chemin absolu d'un fichier appelé à partir de celui d'un autre, tu peux procéder ainsi :
<?php
include (dirname (__FILE__).'/generic/menu.php');
?>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 oct. 2007, 23:51

C'est pas vraiment un chemin global ça... :-k

Avec dirname(__FILE__) tu vas récupérer le dossier du script incluant (que tu obtiendrais aussi bien avec " ./ "), du coup tu es quand même obligé de spécifier un chemin relatif après, et c'est à priori pas le but :)

Avec le document root, tu peux retrouver le répertoire web et ainsi spécifier une adresse globale indépendante du dossier dans lequel le script qui est exécuté ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 443 Messages

26 oct. 2007, 01:34

[...] Avec dirname(__FILE__) tu vas récupérer le dossier du script incluant (que tu obtiendrais aussi bien avec " ./ ") [...]
En fait non, __FILE__ contient le chemin complet du fichier contenant la déclaration __FILE__, donc le script inclus.
dirname(__FILE__) == './' seulement pour le script racine et les fichiers inclus contenus dans le même dossier de le script racine.

test1.php
<?php
header('content-type: text/plain');
echo 'racine ./:'.realpath('./')."\n";
echo 'racine __FILE__:'.realpath(dirname(__FILE__))."\n";

include 'forum/test2.php';
?>
forum/test2.php
<?php
echo 'include ./:'.realpath('./')."\n";
echo 'include __FILE__:'.realpath(dirname(__FILE__))."\n";
?>
Résultat
(identiques)
racine ./: L:\server\wstore\wroot\app1
racine __FILE__: L:\server\wstore\wroot\app1

(différents)
include ./: L:\server\wstore\wroot\app1
include __FILE__: L:\server\wstore\wroot\app1\forum

(racine serveur)
$_SERVER['DOCUMENT_ROOT']: L:\server\wstore\wroot

DOCUMENT_ROOT correspond effectivement à la racine du serveur quelque soit le chemin de la page appellée, donc oubliez dirname(__FILE__) et './'


Tracker.
[ps]
Le truc que je trouve quand même étrange en php, c'est que pour être rendue comme un saut de ligne la séquence \n (et surement d'autres) doit forcement être inscrite dans une chaine "interprétée". Pour résumer:
- "\n" fonctionne
- '\n' fonctionne pas ??!!
Modifié en dernier par Tracker le 26 oct. 2007, 09:43, modifié 1 fois.

Petit nouveau ! | 6 Messages

26 oct. 2007, 08:20

Bonjour,

Finalement j'ai trouvé une solution qui a l'air de bien fonctionner sur mon PC. A voir chez mon hebergeur. Je vous tiens au courant.
<? include ($_SERVER["DOCUMENT_ROOT"]."/generic/menu.php") ?>

C'est vous parait dans l'esprit PHP ?

Je viens de verifier sur free et ca fonctionne :P

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 oct. 2007, 10:03

En fait non, __FILE__ contient le chemin complet du fichier contenant la déclaration __FILE__, donc le script inclus.
dirname(__FILE__) == './' seulement pour le script racine et les fichiers inclus contenus dans le même dossier de le script racine.
Vivi absolument mais dans la mesure ou on cherchait à définir un chemin absolu pour inclure un fichier, c'est qu'on était nécessairement situés au niveay du script racine :)

Pas mieux en revanche pour les '\n' :?
C'est vous parait dans l'esprit PHP ?
Toutafé ! :)
Par contre pour être tranquille, si jamais tu changeais de serveur ou que la config de celui-ci évolue, je te recommande d'utiliser les tag "<?php" au lieu des shorts open tags "<?", et de coller un point-virgule au bout de l'instruction ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...