Sécurité

Include

6.Le langage PHP

6.7.Include

6.7.4.Include et include_path

6.7.4.1.Introduction

On peut considérer qu'il existe 4 façons de préciser le chemin d'un fichier à inclure.
  • En précisant un chemin relatif:
    include('../fichier.php');
  • En précisant un chemin absolu:
    include('C:\www\fichier.php');
    ou
    include('/var/www/fichier.php');
  • En précisant un chemin relatif converti en chemin absolu:
    include(dirname(__FILE__).'/../fichier.php')
    ou
    include(__DIR__.'/../fichier.php')
    depuis PHP 5.3.0
  • En précisant un chemin à rechercher dans l'include_path:
    include('mabliotheque/fichier.php');

6.7.4.2.Chemin relatif

On peut presque dire que l'utilisation du chemin relatif ne fonctionne pas. Le chemin relatif est déterminé à partir du script qui est exécuté (et non du script qui fait l'inclusion). Ainsi si un script stats/stats.php fait l'inclusion d'un script maths/maths.php via
include('../maths/maths.php')
si on lance l'exécution du script stats.php il n'y aura pas de problème: le script maths.php sera correctement intégré.
Include PHP et les chemins relatifs
En revanche si un script principal.php placé à la racine fait appel à stats.php via l'instruction
include('stats/stats.php')
le fichier stats.php sera correctement inclus mais pas maths.php qui sera recherché dans le dossier ../maths relativement à principal.php (et non à stats.php)

6.7.4.3.Chemin absolu

La seconde solution (celle du chemin absolu) est également totalement déconseillée (en tout cas, sous cette forme ci). Ceci implique en effet que le script soit toujours à la même place quelque soit la machine sur laquelle il est copié et quelque soit le contexte (pas de versions différentes en fonction du projet). Si dans votre environnement, le fichier est sous /var/www/ rien ne dit que dans l'environnement d'un autre serveur il n'est pas plutot sous /usr/local/apache/htdocs/ ou même sous C:\EasyPHP\www\. Une variante à cette solution consiste à déclarer une constante dans un fichier de configuration (qu'il faudra toutefois bien inclure)
define('DOSSIER_BIBLIOTHEQUE', '/var/www/');
et remplacer d'éventuels
include('/var/www/include/monfichier.php');
par
include(DOSSIER_BIBLIOTHEQUE.'monfichier.php');
rem
  • Dans l'exemple cité, il s'agit d'un cas particulier où la constante DOSSIER_BIBLIOTHEQUE pourrait être remplacée par la variable prédéfinie[c'est quoi?] $_SERVER['DOCUMENT_ROOT'].'/include' mais cela ne fonctionnerait pas si la bibliothèque devait être utilisée pour un script executé en ligne de commande
  • Dans la mesure du possible il est recommandé de mettre les scripts des bibliothèques en dehors de www/

6.7.4.4.Chemin relatif converti en chemin absolu

Utiliser des chemins relatifs convertis en chemins absolus c'est une solution que je préconise pour les aspects de vos projets où l'arborescence de vos fichiers est clairement définie et n'est pas censée beaucoup évoluer dans le temps. Cette solution sera souvent utilisée dans les scripts d'exemple de ce site car elle vous permet de tester les scripts sans aucune configuration (il suffit juste de respecter la hierarchie des fichiers).
Pour convertir des chemins relatifs en chemins absolus c'est extrêmement simple, il suffit de déterminer le chemin absolu du script qui fait l'inclusion pour cela nous pouvons nous aider des constantes __FILE__ qui donne le chemin complet du script (nom du fichier y compris) ou __DIR__ qui donne le chemin complet du dossier qui contient le script (cette constante n'est disponible que depuis PHP 5.3.0). Pour extraire de __FILE__ le nom du dossier, il suffit d'utiliser la fonction dirname(). Ainsi
include('../fichier.php');
devra être remplacé par
include(dirname(__FILE__).'/../fichier.php')
ou
include(__DIR__.'/../fichier.php')
depuis PHP 5.3.0

6.7.4.5.Chemin à rechercher dans l'include_path

Enfin, la dernière solution consiste à simplement préciser le nom du fichier (et éventuellement ses dossiers parents) et "laisser" PHP rechercher dans un certain nombre d'endroits la présence (ou non) de ce script. Mais où va-t-il chercher ça? Réponse: Dans les dossiers déclarés dans un paramêtre de configuration appelé include_path.
include_path contient une liste de répertoires séparés par des points-virgules sous windows ou des deux-points sous linux. Ou d'une manière plus générale par le caractère défini dans la constante PATH_SEPARATOR
Ainsi si l'on fait un
include('mabibliotheque/fichier.php');
alors que include_path contient la valeur .:/usr/share/php:/usr/share/pear. Alors l'interpreteur PHP cherchera d'abord la présence du fichier mabibliotheque/fichier.php depuis le dossier contenant le script actuellement exécuté (dossier '.') puis il va tester l'existence de /usr/share/php/mabibliotheque/fichier.php puis celle de /usr/share/pear/mabibliotheque/fichier.php. Et s'il ne trouve rien, une erreur sera levée.
Cette méthode est la seule valable pour inclure des bibliothèques de fonctions fournies par des personnes extèrieures à votre projet (PEAR[c'est quoi?], Zend Framework, etc.) et c'est également celle préconisée pour intégrer vos propres bibliothèques dans vos projets
Encore faut-il que le paramètre de configuration include_path soit correctement défini. Or il existe différentes façons de faire comme nous allons le voir.
Ici vous pouvez apprendre :
1.Introduction
2.Installation de PHP
3.Exécuter un script PHP
4.Configuration et environnement d'exécution de PHP
5.L'environnement de développement
6.Le langage PHP
6.1.Introduction
6.2.Mon premier script
6.3.La syntaxe
6.4.Les boucles (for, while, foreach, do) en PHP
6.5.Les tableaux (array) en PHP
6.6.Les fonctions
6.7.Include
6.7.1.Introduction
6.7.2.Include et les bibliothèques de fonction
6.7.3.include_once, require et require_once
6.7.4.Include et include_path
6.7.4.1.Introduction
6.7.4.2.Chemin relatif
6.7.4.3.Chemin absolu
6.7.4.4.Chemin relatif converti en chemin absolu
6.7.4.5.Chemin à rechercher dans l'include_path
6.7.5.Comment configurer include_path?
6.7.6.Include et la mise en page
6.8.Programmation orientée objet
6.9.Les fonctions de manipulation de tableaux
6.10.Les dates
6.11.Fichiers et répertoires
6.12.Les paramètres d'entrée d'un script PHP
6.13.Utilisation de la librairie graphique
6.14.JpGraph pour tracer courbes et diagrammes
6.15.Utilisation de bases de données avec PHP
6.16.LDAP
6.17.Parser un document XML
6.18.Génération de documents PDF en PHP
6.19.Envoyer un mail
6.20.Créer un webmail avec IMAP
6.21.Droits utilisateurs: chmod 777
6.22.Localization (l10n) et Traduction
7.PHP pour le web
8.Internationalisation (i18n) et encodage en PHP
9.Créer un fichier de logs/traces
10.Déboguer une application PHP
11.Programmer en PHP en toute sécurité
12.Bibilothèque PEAR
13.Zend Framework 2 et 3
14.Installation de Zend Framework 2
15.Joomla
16.Composer
17.PHPUnit
18.PHPDocumentor
19.Mesure de temps d'exécution (benchmark) d'une fonction PHP
20.Exemples de scripts PHP
21.Erreurs fréquentes et les solutions
22.Archives
Version imprimable: imprimer