Le point sur la fonction PHP include

Suite à un billet récent où l'on m'a présenté un code HTML complètement désorganisé et comportant plusieurs entêtes (<head></head>), plusieurs déclarations de document (<html></html>) et plusieurs corps de page (<body></body>), j'ai décidé de faire un rapide point sur l'include en PHP et ses mises en garde.

Comprendre le fonctionnement de l’include()

Il est important d’appréhender le mécanisme de la fonction. Cela permettra, par la suite, d’éviter un certain nombre d’erreurs dues à sa mauvaise compréhension.

L’utilisation d’un include() revient à faire un simple copié-collé : le code du fichier appelé est inséré à l’intérieur de la page appelante, à l’endroit exact où se trouve la fonction. Elle peut être placée n’importe où, à l’intérieur du code source : entre les balises <head> et </head> ou <body> et </body>, par exemple.

Le navigateur ne visualisera qu’un seul et même document avec, en lieu et place de votre include(), le contenu du fichier inclus. Afin d’éviter toute erreur, il est préférable d’utiliser des adresses (URLs) absolues, avec le chemin complet par rapport à la racine du site. Si le fichier inclus comporte des liens, ceux-ci pointeront toujours d’après l’adresse de la page appelante. Par conséquent, il suffit qu’un même fichier soit inclus dans des pages de niveaux différents (ex : /fruits/ et /fruits/pommes/ ) pour que les adresses relatives deviennent obsolètes. Par exemple, pour atteindre un fichier situé dans le dossier fruits, nous préférerons l’écriture absolue <a href="/fruits/kiwi.php">page des kiwis</a> à l’écriture relative <a href="fruits/kiwi.php">page des kiwis</a>. Le / précédant l’url indique au navigateur de prendre pour point de départ la racine du site.

Le fichier inclus peut être de n’importe quel type (HTML, JavaScript, PHP, Texte…) et avoir n’importe quelle extension (.htm, .php, .tpl, .kiwi, …) : seul le contenu du fichier importe réellement. Il n’est pas à considérer comme une page à part entière : il n’a pas pour vocation d’être visualisé en tant que tel. L’utilisation d’une extension spécifique significative (comme par exemple .inc.php -pour include-) permet d’avoir une meilleure visibilité et d’éviter ainsi quelques erreurs.

Pour éviter toute faille de sécurité, nous préférerons utiliser une extension .php afin que le fichier soit automatiquement interprété et sa source non visualisable dans le navigateur. Toute autre extension permettrait à quiconque d’avoir accès au contenu du fichier, ce qui pourrait se révéler problématique s’il contenait des données confidentielles, comme par exemple des informations de connexion à mysql.

Enfin, n’oubliez pas qu’un include() est une fonction php. Il est donc impératif que l’extension de votre page appelante soit de type php.

Exemple d’utilisation

Nous allons inclure les fichiers titre.inc.php et contenu.inc.php à l’intérieur de la page test.php. Ci-dessous, le contenu des trois fichiers :

titre.inc.php
Alsacréations vous conseille de manger des kiwis.
contenu.inc.php
Mangez des kiwis, ça vous réussit…
Mais rassurez-vous, une pomme, ça va aussi !
test.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="fr" lang="fr">
<head>
  <title><?php include('titre.inc.php'); ?></title>
</head><body>
  <h1><?php include('contenu.inc.php'); ?></h1>
</body>
</html>

Au final, le navigateur visualisera test.php comme ceci :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="fr" lang="fr">
<head>
  <title>Alsacréations vous conseille de manger des kiwis.</title>
</head><body>
  <h1>Mangez des kiwis, ça vous réussit…
  Mais rassurez-vous, une pomme, ça va aussi !</h1>
</body>
</html>

Erreur courante

L’erreur la plus classique est l’amalgame qui est fait entre l’utilisation de frames ou d’iframes et d’include(). Là où les frames et autres iframes simulent l’insertion d’une page à l’intérieur d’une autre grâce au navigateur, la fonction include() injecte réellement la totalité du fichier, du côté du serveur web.

Un cas typique : l’insertion d’une page complète au moyen d’un include().

page_htm_a_inserer.htm
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="fr" lang="fr">
<head>
  <title></title>
</head><body>
  <h1>Mangez des kiwis, ça vous réussit…
  Mais rassurez-vous, une pomme, ça va aussi !</h1>
</body>
</html>
test.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="fr" lang="fr">
<head>
  <title>Alsacréations vous conseille de manger des kiwis.</title>
</head><body>
  <h1><?php include('page_htm_a_inserer.htm'); ?></h1>
</body>
</html>

Au final, le navigateur visualisera test.php comme ceci :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="fr" lang="fr">
<head>
  <title>Alsacréations vous conseille de manger des kiwis.</title>
</head><body>
  <h1><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="fr" lang="fr">
<head>
  <title></title>
</head><body>
  <h1>Mangez des kiwis, ça vous réussit…
  Mais rassurez-vous, une pomme, ça va aussi !</h1>
</body>
</html></h1>
</body>
</html>

Comme vous pouvez le constater, la totalité du code de la page page_htm_a_inserer.htm à été inclus dans notre page test.php.
Il en résulte une imbriquation de deux structures HTML complètes. La page est totalement incohérente et n’a aucune chance d’être interprétée correctement par les navigateurs.

Pour en savoir plus et pour mettre ces informations en pratique, suivez le tutoriel complet : "Inclure un fichier dans un autre grâce à PHP"

Trackbacks

Le lundi 30 mai 2005 à 20:43, de akka blog :: #

PHP et Include

Il est toujours bon de rappeler que la fonction Include de PHP est une fonction très utile, mais encore beaucoup de jeunes paladins l'utilisent sans se soucier des risques de cette simple fonction qui peut devenir très dangereuse pour son propre...

Le mardi 7 juin 2005 à 22:02, de castanos.org :: #

include ou require ?

Je profite d'un bon article sur Alsacréations pour mettre en lumière la différence entre les fonctions require et include, et ceci est plutôt simple.

Les trackbacks pour ce billet sont fermés.

Evaluez ce billet

Commentaires

Le dimanche 29 mai 2005 à 21:31, par pickupjojo :: site :: #

Merci pour ces petits précisisons, malgré que personnellement j'en connaissais déjà une bonne partie. :-)

Le dimanche 29 mai 2005 à 21:49, par shadow84 :: #

Salut Raphaël!

Un petit mot pour te feliciter pour ton superbe site qui est pour moi une reference sans conteste dans le monde du Webdesign avec CSS! Le top!
Des que mon site sera pret, je ne manquerai pas de te faire un renvoi sur ton site. Avant tout cela, je souhaiterai ton avis et ton conseil sur 2 articles qui figurent sur ton site; voila les references:
css.alsacreations.com/Tut...

css.alsacreations.com/Tut...

Je ne sais pas bien quelle solution choisir. J'ai bien compris les avantages et les incovenients de chaque technique mais le choix reste confus ... Pour ma part, j'ai l'impression que pour un site aboutit en production, la solution de faire une page d'index avec un switch php semble excellente, tandis que pour un site en cours de dev l'include php au debut ou aux endroits propices du site semble convenir ou tout du moins dans un 1er temps. En bref, la solution du switch semble presenter le site dans sa forme la plus rationalisée ...
Qu'en penses tu ? Merci d'avance pour tes lumieres sur la question!

Le dimanche 29 mai 2005 à 21:56, par Raphael :: site :: #

@shadow84 > ben euh j'en pense surtout que ton commentaire n'a pas grand chose à voir avec ce billet de blog :-/
A la rigueur, c'est le genre de questions à poser sur le forum par exemple, tu y trouveras plein de gens compétents et disponibles ;)

Le dimanche 29 mai 2005 à 22:54, par solo :: site :: #

Ma foi, un bon résumé avec un point de vue se plaçant de l'autre coté du traitement serveur :)

Le lundi 30 mai 2005 à 02:49, par Merkel :: #

Enfin, une petite précision sur les includes. C'est juste dommage que Solo continue à de parler de pseudo-frames. Vous savez pour la plupart à quel point j'ai horreur de ce pseudo terme sortit de nul part et souvent risque de confusion chez les novices... Je parle par expérience, c'est arrivé à de nombreuses reprises que ce terme à suscité des confusions tant au niveau du novice que chez la personne essayant de donner un coup de main.

Le lundi 30 mai 2005 à 02:51, par Merkel :: #

Arf...pardonnez-moi mes quelques fautes dans mon message précédent. Je suis un peu fatigué ce soir. Dur journée. :p

Le lundi 30 mai 2005 à 08:00, par clb56 :: site :: #

à raphael

Tout d'abord bonjour :-)

Je continue à penser que les choses ne sont pas encore assez clairement dites y compris dans ta mise au point.

Il faut à mon sens + insister sur les 2 types d'inclusion en jeu :

Par <iframe> ou <object data="page.html"> une page est incluse dans une autre page et ce dans la fenêtre du navigateur.

Par la fonction include du texte brut est inclut dans la source du document html. le fichier mis en <?php include ?> n'a aucune vocation à être ouvert par le navigateur, ce n'est pas une page, ce n'est pas un document html.

Il n'y a pas à enlever les balises <html> etc ... Car la question de leur présence ne se pose même pas puisqu'il ne s'agit en rien d'une page web.

Une difficulté importante du coup se présente car comment faire comprendre que l'on peut inclure fichier_à_inclure.html (ou fichier_à_inclure.php) mais que fichier_à_inclure.html n'est pas une page alors que très précisemment c'en est une, la preuve c'est que si l'on clique dessus c'est bien le logiciel navigateur qui va l'ouvrir.

Comment quelqu'un de peu informer peut-il s'y retrouver dans un tel contexte ?

Je crois vraiment que pour éclaircir les choses le premier point serait d'en rester à des extensions plus significatives des fichiers comme fichier_à_inclure.txt ou .inc (que personnellement je privilégie)

++

Le lundi 30 mai 2005 à 09:38, par solo :: site :: #

@Merkel,

je suis plus ou moins d'accord avec le fait que le terme est inadapté. Pk pas complètement? Car il faut bien donner un nom au processus et que de manière empirique on en est arrivé à ce terme. Evidemment, tu fais bien de recadrer les novices que tu aides comme la plupart des personnes un peu plus expérimenté par le biais des forums d'entraides.

Pk pas complètement également? car pseudo veut bien dire ce que ça veut dire: ce n'est pas une frame, ni une iframe ^^

Le terme tente de décrire un découpage logique de la page html. Un peu confus donc j'avoue :)

ça ne tiens qu'à nous de populariser un terme plus adapté. Qu'en est-il du coté des anglophones?

Le lundi 30 mai 2005 à 09:56, par Raphael :: site :: #

@Solo : "ça ne tiens qu'à nous de populariser un terme plus adapté."

> Media-box (dans leur tuto que je n'arrive plus à retrouver) parle de "fichiers réutilisables en PHP"

Le lundi 30 mai 2005 à 11:48, par Bruno :: site :: #

Bonjour à tous,

>la meilleure des solutions serait d'en rester
>à des extensions plus significatives des
>fichiers comme fichier_à_inclure.txt ou
>fichier_à_inclure.inc. On évite ainsi les
>incompréhensions.

Je déconsille vivement cette méthode, à moins de vraiment savoir ce que l'on fait, je m'explique :
Un serveur configuré normalement n'exécutera pas le code d'un fichier .txt ou .inc si ce fichier est appelé seul, hors de son contexte d'inclusion. La conséquence est que si quelqu'un tombe sur l'url de ce fichier le serveur lui renverra le code source du script en mode texte.

Un exemple facheux : créer un fichier connect.inc contenant ses paramètres de connexion à une base de données (on doit pouvoir trouver de nombreux exemples réels).

Mais si on y tient vraiment, on peut toujours mettre tous ses fichiers inclus dans un répertoire protégé par un .htaccess (deny from all) ou alors adopter la méthode phpmyadmin : fichier.inc.php.
Autre possibilité : configurer son serveur pour qu'il exécute les .inc comme du php, mais il faut avoir la main pour ça.

--
Bruno

Le lundi 30 mai 2005 à 14:06, par Merkel :: #

"Car il faut bien donner un nom au processus"

Pourquoi vouloir trouver un autre nom que Include ? Pourquoi faut-il absolument trouver un nom original ? Même si on dit pseudo-frames, même si pseudo = faux, on relie quand même ce processus aux frames. Cela n'a rien à voir avec les frames, ni de près, ni de loin, mais ca tu le sais déjà évidemment. Seulement, les novices qui sont déjà très attachés aux frames ont encore plus de mal à se les sortir de la tête. Je déplore l'utilisation du terme pseudo-frames. C'est trop une source de confusion. Je préfère parler d'Include simplement. Pour le reste, le tutorial ou le dialogue suffira à informer le novice comment faire. Le nom du processus n'informe en rien la personne, cela ne fait qu'accentuer sa confusion.

Le lundi 30 mai 2005 à 16:15, par Nyro Xeo :: #

Je me suis souvent confronté à ce problème (en tant qu'aidant); un débutant qui incluait une page complète dans une autre page complète, il en résultait justement une page avec plusieurs <html>, <body> et autre...

J'ai alors fait un schéma pour mieux "expliquer" le concept qui est de réellement _inclure_ la page dans une autre page. Après quelques remasterisations graphiques (:P) de la part de dib258, voici le schéma : nyro.xeo.online.fr/SdZ/fi...

Le mardi 31 mai 2005 à 01:03, par shadow84 :: #

Bonsoir à tous,


@Raphaël> Certes, je n'aurais peut etre pas du tourner mon commentaire de la sorte... D'autant plus que c'etait pas tout à fait inline avec la majeure partie de l'article
1)Pseudo-frames ?
2)Attention aux doublons HTML
Ceci dit l'article finissait par:
3)Suivez le bon chemin
Je voulais juste evoquer l'autre possibilité qui se trouve sur ton site... Peut etre plus simple à comprendre pour des débutants mais bien moins rationnalisée et aboutie que le switch... Anyway ca a fait couler de l'encre!
Excuse ma maladresse, c'est la 1ere fois que j'interviens! Y a un début à tout!


@Solo> tres bon aussi ton article


Pour ma part, je trouve la citation reprise par Raphael appropriée : fichiers réutilisables en PHP"
On peut aussi parler d'inclusion de morceau de code au sein d'une page.

A+

Le mardi 31 mai 2005 à 06:23, par jb_gfx :: #

Et que pensez vous des pseudo includes avec la fonction require()?

C'est pas pour troller mais juste pour dire que je suis à 200% avec Merkel, un include est un include et une frame est une frame point. Sinon on a qu'a appeller le PHP du pseudo HTML tant qu'on y est, puiqu'il permet lui aussi de générer des documents HTML... non mais ça ne viendrait à l'idée de personne de faire ça.

Le mardi 31 mai 2005 à 10:25, par clb56 :: #

@shadow84> "On peut aussi parler d'inclusion de morceau de code au sein d'une page."

C'est précisemment avec ce genre de terminologie que l'on peut entretenir la confusion.

C'est quoi une page ?
Pour tout un chacun c'est aussi bien la page web telle qu'elle apparait dans la fenêtre du navigateur.

Pourquoi ne pas utiliser l'expression plus strictement technique de code source du document.

Encore une fois même dans le cas de ceux qui veulent mettre les choses au point celà manque de clarté.

Le mardi 31 mai 2005 à 12:26, par martin© :: #

Je suis d'accord avec le billet, mais je suis surpris qu'il ne parle pas de la fonction readfile() pour l'inclusion de portion d'html pur.

Donc je précise (c'est d'ailleurs signalé dans le billet ) que la fonction include() "inclut et exécute le fichier spécifié en argument". Le point important, c'est que le fichier est executé.
Pour juste inclure du contenu n'ayant pas à être interprété par php, readfile() est plus adapté et économique.
Je précise de plus que le fichier peut trés bien ne pas comporter d'extension (pour include et readfile), dans tous les cas (n'importe quelle extension, ou pas d'extension) include est parsé, et readfile pas.

Le mardi 31 mai 2005 à 13:37, par Raphael :: site :: #

@martin© > En fait, l'idée de faire un point sur la fonction include() est due au fait que c'est la fonction la plus utilisée pour ce genre de cas (quasiment tout le temps).
Il me semblait donc important de mieux la cerner pour éviter des malentendus.

Personnellement, adepte (comme tout le monde) de include(), je ne connaissais même pas readfile().
Je vais me renseigner sur celle-ci, merci :)

Le mardi 31 mai 2005 à 21:14, par jcm :: #

Bonjour,

Mon utilisation de "include" :

- dans le cas d'un script qui sera commun à plusieurs pages, par exemple un script formatant uns date en français : il est appelé sur chaque page pour laquelle il sera nécessaire.

- dans le cas d'un script complexe et long, "include" permet de le scinder en différents modules ce qui est simplement une facilité afin de ne pas avoir, dans son éditeur, une très longue page illisible.

Je nomme toujours un include avec une extension "php" par sécurité : une maniaquerie qui évite de stocker des paramètres de connexion à une base de données dans un "inc" auquel tout le monde pourrait accéder.

Je stocke toujours ces "include" dans un répertoire dédié, tout comme les "js" ou "css" : un peu d'ordre ne nuit pas !

Pour moi un "include" est donc un fragment de code php, contenu dans un fichier exécutable pour quelque question de commodité et qui n'a rien de commun avec une "frame" : "frame" signifie "cadre", "monture" (verres), "encadrement", "charpente", "carcasse"...

Que ceux pour lesquels il y aurait encore une confusion pensent à ceci : un "include" n'est qu'une annexe à un script tandis qu'une "frame" est un élément de la structure, généralement graphique, d'une page.

Le mardi 7 juin 2005 à 19:53, par bastien :: site :: #

include('essai/config.inc.php')
cela marche trés bien mais :
include('../essai/config.inc.php')
pourquoi cela ne fct pas
include ne va pas chercher des fichiers à la source ou en arrière dans l'arborescence de mon site Merci

Le vendredi 10 juin 2005 à 01:59, par mike72 :: #

Salut a tous

Pour ma part j'essaye d'utiliser la fonction include, j'ai recopié le code donné en exemple sur le site, mais chez moi ca ne marche pas. Que se passe t'il ? Je doit présenter mon site le 20 juin a mon directeur
de stage. J'ai besoin d'aide ... Merci tout le monde

Le vendredi 10 juin 2005 à 09:31, par Raphael :: site :: #

@mike72 > heureusement, il y'a un forum fait pour ça sur Alsa :)

Le mardi 21 juin 2005 à 13:37, par gimli :: site :: #

Personnellement, je comprends pourquoi certaines personnes parlent de pseudo frame. J'ia changé récemment tout monde site, en enlevant les frames, et en mettant à la place des includes (avec une structure en "table", décidemment, j'ai toujours 10 ans de retard... faudrait passer aux DIV)... Mais bon, bien sûr, c'est un include, ce sont deux choses differentes !
Mais sinon ,c'est un très bon tuto ! même si je connaissais déjà.

Le jeudi 23 juin 2005 à 10:40, par asene :: #

Une autre fonction d'include très utile dans certains cas (mais presque jamais utilisée) consiste à l'insérer directement dans les CSS.
Par exemple :

body {
background-color: <? include("coulbody.txt"); ?>;
}

... où la valeur, dans cet exemple, est récupérée dans un fichier texte qui peut être directement écrit en PHP par la fonction fwrite.

Ajouter un commentaire

Les commentaires pour ce billet sont fermés.