web-dev-qa-db-fra.com

chemin racine ne fonctionne pas avec php include

/ au début d'un lien pour accéder au dossier racine ne fonctionne pas dans php include.

par exemple "/example/example.php"

Quelle est la solution?

40
Per Magnusson

Je suppose que par dossier racine vous entendez la racine de votre document Web plutôt que la racine du système de fichiers.

À cette fin, vous pouvez soit

  • ajoutez le dossier racine Web au chemin include et include('example/example.php')
  • ou vous pouvez include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')
55
Paul Dixon

J'ai eu ce problème aussi. La réponse de Paul Dixon est correcte, mais peut-être que cela vous aidera à comprendre pourquoi:

Le problème ici est que PHP est un langage côté serveur. Lorsque des documents HTML purs peuvent accéder aux fichiers en fonction de l’URL racine que vous avez configurée sur le serveur (c.-à-d. Pour accéder à une image à partir d’un sous-répertoire sur lequel vous vous trouvez, vous utiliseriez /images/example.jpg pour aller du répertoire principal vers le bas), PHP accède effectivement à la racine du serveur lorsque vous utilisez include (/images/example.jpg)

La structure de site que vous avez configurée se trouve en réalité dans un système de fichiers du serveur Apache. La racine de mon site ressemble à ceci, en partant de la racine du serveur pour descendre:

/home2/siteuserftp/public_html/test/

"test" représente la racine de votre site

Donc, pour répondre à votre question, pourquoi PHP include ne donne pas le résultat souhaité (il fonctionne exactement comme il se doit), c'est parce que vous demandez au code PHP d'essayer trouvez votre fichier à la racine du serveur, alors qu’il se trouve à la racine HTML de votre site, ce qui pourrait ressembler à ce qui précède.

Votre fichier serait basé sur la racine du site "test /" et ressemblerait à ceci:

/home2/siteuserftp/public_html/test/about/index.php

La réponse fournie par Paul Dixon:

include($_SERVER['DOCUMENT_ROOT'].'/example/example.php')

est exactement ce qui va résoudre votre problème (ne vous inquiétez pas de chercher la racine du document pour remplacer 'DOCUMENT_ROOT', PHP le fera pour vous. Assurez-vous simplement que vous avez littéralement 'DOCUMENT_ROOT' dedans)

MODIFIER:

Plus d'informations DOCUMENT_ROOT et autre PHP variables SERVEUR peuvent être trouvés ici

28
Ian

include () (et de nombreuses autres fonctions telles que require (), fopen (), etc.) fonctionnent toutes hors du système de fichiers local, pas de la racine Web.

Alors, quand tu fais quelque chose comme ça

include( "/example/example.php" );

Vous essayez d'inclure à partir de la racine de votre machine * nix.

Et bien qu'il existe une multitude de façons d'aborder ce que vous faites, les suggestions de Paul Dixon sont probablement vos meilleurs choix.

5
Peter Bailey

Chaque serveur Web a un dossier public_html, dans lequel vous conservez généralement vos fichiers, etc. En utilisant /, vous n'obtiendrez pas le public_html, mais vous le dirigerez vers la racine principale (inaccessible). Donc, utilisez $_SERVER['DOCUMENT_ROOT']."/your/locati.on" à la place

3
Gameselop

J'ai résolu ce problème sur une machine exécutant Windows et IIS avec les éléments suivants:

<?php
  $docroot = 'http://www.example.com/';
  include ($docroot.'inc-header.php');
?>

Si vous êtes sur une machine de développement locale, vous pouvez forcer votre domaine à pointer sur localhost en ajoutant les éléments suivants dans C:\Windows\System32\drivers\etc\hosts.

127.0.0.1   www.example.com

En outre, vous devrez activer allow_url_include dans php.ini comme si

allow_url_include = On
2
David

Pour moi, l'astuce suivante a fonctionné… .. J'utilise Windows avec IIS, donc DOCROOT est C:\Inetpub\wwwroot.

  1. ne sous-station de C:\Inetpub\wwwroot à un lecteur. Que ce soit W: (contenu WEB).
 subst W: C:\Inetpub\wwwroot 
  1. editez php.ini de cette façon: ajoutez W:\à include_path, remplacez doc_root par W: \

 include_path = ".; c:\php\active\includes; W: \" 
 doc_root = W:\

  1. placez la commande subst dans le fichier CMD du dossier Démarrage pour effectuer le mappage automatiquement.

Maintenant, les deux versions autorisées:


 include '/common/common.inc'; // accès au mappé W: root 
 inclure 'common/common.inc'; // accès à W: dans include_path 

0
Andrey Baluevsky

certaines versions de PHP peuvent avoir le délimiteur à la fin de la racine du document, d'autres pas. En pratique, vous voudrez peut-être utiliser:

    $r = trim(filter_input(INPUT_SERVER, 'DOCUMENT_ROOT', FILTER_SANITIZE_STRING));
    if (substr($r, 0, 1) == '/')
    {
      define("PATCH_SEPARATOR", "/");  
    }
    else
    {
      define("PATCH_SEPARATOR", "\\");    
    }

    if (substr($r, -1) == PATCH_SEPARATOR)
    {
      include_once ($r . 'example/example.php');
    }
    else
    {
      include_once ($r . PATCH_SEPARATOR . 'example/example.php');
    }
0
user1123382