30/12/2015
Transmettre des donn es avec les formulaires
% $
Accueil
Cours
Concevez votre site web avec PHP et MySQL
Transmettre des donn es avec les formulaires
Concevez votre site web avec PHP et MySQL
2 < @ ?
Z
30 heures & Facile
Licence
8
-
TRANSMETTRE DES DONN ES AVEC LES FORMULAIRES
13:58
= Pour t l charger toutes les vid os de ce cours, devenez Premium
Les formulaires constituent le principal moyen pour vos visiteurs d'entrer des informations sur votre site. Les
formulaires permettent de cr er une interactivit .
Par exemple, sur un forum on doit ins rer du texte puis cliquer sur un bouton pour envoyer son message. Sur un livre
d'or, sur un mini-chat, on proc de de la m me fa on. On a besoin des formulaires partout pour changer des
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
1/21
30/12/2015
Transmettre des donn es avec les formulaires
informations avec nos visiteurs.
Vous allez voir qu'il y a de nombreux rappels de HTML dans ce chapitre& et ce n'est pas un hasard : ici, le PHP et le
HTML sont intimement li s. Le HTML permet de cr er le formulaire, tandis que le PHP permet de traiter les
informations que le visiteur a entr es dans le formulaire.
Ce chapitre est particuli rement important, nous r utiliserons ce que nous avons appris ici dans toute la suite du
cours. Soyez attentifs !
Cr er la base du formulaire
En HTML, pour ins rer un formulaire, on se sert de la balise <form> . On l'utilise de la mani re suivante :
T
php
1
2
3
4
5
6
7
<form method="post" action="cible.php">
<p>
On ins rera ici les l ments de notre formulaire.
</p>
</form>
On crira le contenu de notre formulaire entre les balises <form> et </form> . Si vous avez lu mon cours
de HTML/CSS, vous verrez qu'une bonne partie de ce chapitre ne sera compos e que de rappels puisque je
vais vous expliquer comment on ins re les champs du formulaire dans la page. Cependant, et ce sera
nouveau, nous allons aussi d couvrir comment traiter en PHP les donn es qui ont t envoy es par le visiteur.
Je souhaite attirer votre attention sur la toute premi re ligne de ce code. Il y a deux attributs tr s importants
conna tre pour la balise <form> : la m thode ( method ) et la cible ( action ). Il est imp ratif que vous compreniez
quoi ils servent.
La m thode
Il faut savoir qu'il existe plusieurs moyens d'envoyer les donn es du formulaire (plusieurs m thodes ). Vous pouvez
en employer deux.
get : les donn es transiteront par l'URL comme on l'a appris pr c demment. On pourra les r cup rer gr ce
l'array $_GET . Cette m thode est assez peu utilis e car on ne peut pas envoyer beaucoup d'informations dans
l'URL (je vous disais dans le chapitre pr c dent qu'il tait pr f rable de ne pas d passer 256 caract res).
post : les donn es ne transiteront pas par l'URL, l'utilisateur ne les verra donc pas passer dans la barre
d'adresse. Cette m thode permet d'envoyer autant de donn es que l'on veut, ce qui fait qu'on la privil gie le
plus souvent. N anmoins, les donn es ne sont pas plus s curis es qu'avec la m thode GET et il faudra
toujours v rifier si tous les param tres sont bien pr sents et valides, comme on l'a fait dans le chapitre
pr c dent. On ne doit pas plus faire confiance aux formulaires qu'aux URL.
C'est vous de choisir par quelle m thode vous souhaitez que les donn es du formulaire soient envoy es. Si vous
h sitez, sachez que dans 99 % des cas la m thode que l'on utilise est post , vous crirez donc method="post"
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
2/21
30/12/2015
comme je l'ai fait.
La cible
Transmettre des donn es avec les formulaires
L'attribut action sert d finir la page appel e par le formulaire. C'est cette page qui recevra les donn es du
formulaire et qui sera charg e de les traiter.
Imaginons le sch ma de la figure suivante.
Appel de la page cible par le formulaire
Dans cet exemple, le formulaire se trouve dans la page formulaire.php . Cette page ne fait aucun traitement
particulier, mais une fois le formulaire envoy (lorsqu'on a cliqu sur le bouton Valider ), le visiteur est redirig vers
la page cible.php qui re oit les donn es du formulaire, comme vous le montre la figure suivante.
Fonctionnement d'un formulaire
Le nom de la page cible est d fini gr ce l'attribut action .
La page cible ne doit pas forc ment s'appeler cible.php . J'utilise ce nom dans mes exemples simplement
pour que vous compreniez bien que c'est la page qui est appel e.
Remarquez qu'en th orie rien n'emp che le formulaire de s'appeler lui-m me. Il suffirait d' crire
action="formulaire.php" . Dans ce cas, la page du formulaire doit tre capable aussi bien d'afficher le
formulaire que de traiter les donn es. C'est tout fait possible de le faire mais afin de ne pas compliquer les
choses trop vite, on va viter de faire comme a ici. ;-)
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
3/21
30/12/2015
Transmettre des donn es avec les formulaires
Retenez donc bien que vous travaillez normalement sur deux pages diff rentes : la page qui contient le formulaire
( formulaire.php dans notre exemple), et celle qui re oit les donn es du formulaire pour les traiter
( cible.php ).
Les l ments du formulaire
T
Dans un formulaire, vous le savez peut- tre d j , on peut ins rer beaucoup d' l ments diff rents : zones de texte,
boutons, cases cocher, etc.
Je vais ici tous les num rer et vous montrer comment vous servir de chacun d'eux dans la page cible.php qui fera
le traitement. Vous allez voir, c'est vraiment tr s simple : au lieu de recevoir un array $_GET , vous allez recevoir un
array $_POST contenant les donn es du formulaire !
Les petites zones de texte
Une zone de texte ressemble la figure suivante.
Zone de texte
En HTML, on l'ins re tout simplement avec la balise :
1
<input type="text" />
php
Pour les mots de passe, vous pouvez utiliser type="password" , ce qui aura pour effet de cacher le texte
entr par le visiteur. part ce d tail, le fonctionnement reste le m me.
Il y a deux attributs conna tre que l'on peut ajouter cette balise.
name (obligatoire) : c'est le nom de la zone de texte. Choisissez-le bien, car c'est lui qui va produire une
variable. Par exemple :
<input type="text" name="pseudo" /> .
value (facultatif) : c'est ce que contient la zone de texte au d part. Par d faut, la zone de texte est vide mais il
peut tre pratique de pr -remplir le champ. Exemple :
<input type="text" name="pseudo" value="M@teo21" /> .
Oui, je sais que vous commencez vous inqui ter car vous n'avez pas encore vu de PHP pour le moment mais n'ayez
pas peur. Le fonctionnement est tout simple et a un air de d j vu. Le texte que le visiteur aura entr sera disponible
Publicité
dans cible.php sous la forme d'une variable appel e $_POST['pseudo'] .
Pour l'exemple, je vous propose de cr er un formulaire qui demande le pr nom du visiteur puis qui l'affiche fi rement
sur la page cible.php . On va donc distinguer deux codes source : celui de la page du formulaire et celui de la page
cible.
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
4/21
php
php
30/12/2015
Transmettre des donn es avec les formulaires
Voici le code de la page formulaire.php :
1
2
3
4
5
6
7
8
9
10
11
<p>
Cette page ne contient que du HTML.<br />
Veuillez taper votre pr nom :
</p>
<form action="cible.php" method="post">
<p>
<input type="text" name="prenom" />
<input type="submit" value="Valider" />
</p>
</form>
Rappel de HTML : le champ <input type="submit" /> permet de cr er le bouton de validation du
formulaire qui commande l'envoi des donn es, et donc la redirection du visiteur vers la page cible.
Maintenant, je vous propose de cr er la page cible.php . Cette page va recevoir le pr nom dans une variable
nomm e $_POST['prenom'] .
1
2
3
4
5
<p>Bonjour !</p>
<p>Je sais comment tu t'appelles, h h . Tu t'appelles <?php echo $_POST['prenom']; ?> !</p>
<p>Si tu veux changer de pr nom, <a href="formulaire.php">clique ici</a> pour revenir la page
formulaire.php.</p>
Le code web suivant ouvre la page formulaire.php pour que vous puissiez tester.
Essayer !
Dans cible.php on a affich une variable $_POST['prenom'] qui contient ce que l'utilisateur a entr dans le
formulaire.
Les grandes zones de texte
La grande zone de texte (on l'appelle aussi zone de saisie multiligne ) ressemble la figure suivante.
Une grande zone de texte
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
5/21
30/12/2015
Transmettre des donn es avec les formulaires
On peut y crire autant de lignes que l'on veut. C'est plus adapt si le visiteur doit crire un long message, par
exemple.
On va utiliser le code HTML suivant pour ins rer cette zone de texte :
1
2
3
<textarea name="message" rows="8" cols="45">
Votre message ici.
</textarea>
php
L encore, on a un attribut name qui va d finir le nom de la variable qui sera cr e dans cible.php . Dans notre
cas, ce sera la variable $_POST['message'] .
Vous remarquerez qu'il n'y a pas d'attribut value . En fait, le texte par d faut est ici crit entre le <textarea> et le
</textarea> . Si vous ne voulez rien mettre par d faut, alors n' crivez rien entre <textarea> et
</textarea> .
Les attributs rows et cols permettent de d finir la taille de la zone de texte en hauteur et en largeur
respectivement.
La liste d roulante
La figure suivante est une liste d roulante.
Une liste d roulante
On utilise le code HTML suivant pour construire une liste d roulante :
php
1
2
3
4
5
6
<select name="choix">
<option value="choix1">Choix 1</option>
<option value="choix2">Choix 2</option>
<option value="choix3">Choix 3</option>
<option value="choix4">Choix 4</option>
</select>
Tout b tement, on utilise la balise <select> laquelle on donne un nom (ici : choix ). On crit ensuite les
diff rentes options disponibles& puis on referme la balise avec </select> .
Ici, une variable $_POST['choix'] sera cr e, et elle contiendra le choix qu'a fait l'utilisateur. S'il a choisi Choix
3 , la variable $_POST['choix'] sera gale au value correspondant, c'est- -dire choix3 .
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
6/21
30/12/2015
Transmettre des donn es avec les formulaires
Vous pouvez aussi d finir le choix par d faut de la liste. Normalement c'est le premier, mais si vous rajoutez l'attribut
selected="selected" une balise <option> , alors ce sera le choix par d faut. On pourrait par exemple crire :
php
1
<option value="choix3" selected="selected">Choix 3</option>
Les cases cocher
La figure suivante repr sente une s rie de cases cocher.
Cases cocher
On utilisera le code suivant pour afficher des cases cocher :
1
<input type="checkbox" name="case" id="case" /> <label for="case">Ma case cocher</label>
php
L'utilisation de la balise <label> n'est pas obligatoire mais je la recommande fortement. Elle permet
d'associer le libell la case cocher qui a le m me id que son attribut for , ce qui permet de cliquer sur
le libell pour cocher la case. On y gagne donc en ergonomie.
L encore, on donne un nom la case cocher via l'attribut name (ici : case ). Ce nom va g n rer une variable dans
la page cible, par exemple $_POST['case'] .
Si la case a t coch e, alors $_POST['case' ] aura pour valeur on .
Si elle n'a pas t coch e, alors $_POST['case'] n'existera pas. Vous pouvez faire un test avec
isset($_POST['case']) pour v rifier si la case a t coch e ou non.
Si vous voulez que la case soit coch e par d faut, il faudra lui rajouter l'attribut checked="checked ". Par exemple :
php
1
<input type="checkbox" name="case" checked="checked" />
Publicité
Les boutons d'option
Les boutons d'option fonctionnent par groupes de deux minimum. Vous trouverez un exemple sur la figure suivante.
Boutons d'option
Le code correspondant cet exemple est le suivant :
1
Aimezvous les frites ?
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
php
7/21
30/12/2015
Transmettre des donn es avec les formulaires
2
3
<input type="radio" name="frites" value="oui" id="oui" checked="checked" /> <label
for="oui">Oui</label>
<input type="radio" name="frites" value="non" id="non" /> <label for="non">Non</label>
Comme vous pouvez le voir, les deux boutons d'option ont le m me nom ( frites ). C'est tr s important, car ils
fonctionnent par groupes : tous les boutons d'option d'un m me groupe doivent avoir le m me nom. Cela permet au
navigateur de savoir lesquels d sactiver quand on active un autre bouton du groupe. Il serait b te en effet de pouvoir
s lectionner la fois Oui et Non .
Pour pr -cocher l'un de ces boutons, faites comme pour les cases cocher : rajoutez un attribut
checked="checked" . Ici, comme vous pouvez le voir, Oui est s lectionn par d faut.
Dans la page cible, une variable $_POST['frites'] sera cr e. Elle aura la valeur du bouton d'option choisi par le
visiteur, issue de l'attribut value . Si on aime les frites, alors on aura $_POST['frites'] = 'oui' .
Il faut bien penser renseigner l'attribut value du bouton d'option car c'est lui qui va d terminer la valeur de la
variable.
Les champs cach s
Les champs cach s constituent un type de champ part. En quoi a consiste ? C'est un code dans votre formulaire qui
n'appara tra pas aux yeux du visiteur, mais qui va quand m me cr er une variable avec une valeur. On peut s'en servir
pour transmettre des informations fixes.
Je m'explique : supposons que vous ayez besoin de retenir que le pseudo du visiteur est Mateo21 . Vous allez
taper ce code :
php
1
<input type="hidden" name="pseudo" value="Mateo21" />
l' cran, sur la page web on ne verra rien. Mais dans la page cible, une variable $_POST['pseudo'] sera cr e, et
elle aura la valeur Mateo21 !
C'est apparemment inutile, mais vous verrez que vous en aurez parfois besoin.
On croit par erreur que, parce que ces champs sont cach s, le visiteur ne peut pas les voir. C'est faux ! En effet,
n'importe quel visiteur peut afficher le code source de la page et voir qu'il y a des champs cach s en lisant le
code HTML. Mieux, il peut m me modifier la valeur du champ cach s'il a les outils appropri s.
Que faut-il retenir ? Ce n'est pas parce que le champ est cach que vous devez consid rer qu'il est inviolable.
N'importe quel visiteur (un peu malin) peut le lire, modifier sa valeur et m me le supprimer. Ne faites pas
confiance aux donn es envoy es par le visiteur ! Vous vous souvenez de cette r gle dont je vous ai parl dans
le chapitre pr c dent ? Elle est plus que jamais d'actualit .
Ne faites jamais confiance aux donn es re ues : la faille XSS
T
Vous vous souvenez des mises en garde que j'avais faites dans le chapitre pr c dent ? Elles ne concernaient pas que
les param tres qui transitent par l'URL : tout cela vaut aussi pour les formulaires !
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
8/21
30/12/2015
Transmettre des donn es avec les formulaires
Mais& autant je vois comment on peut modifier l'URL, autant je ne comprends pas comment peut faire un
visiteur pour modifier le formulaire de mon site et trafiquer les donn es !
On a tendance croire que les visiteurs ne peuvent pas bidouiller le formulaire mais c'est faux. Je vais dans un
premier temps vous montrer pourquoi les formulaires ne sont pas plus s rs que les URL, puis je vous parlerai d'un
autre danger important : la faille XSS. Avec a, nous aurons vraiment fait le tour de ce qu'il faut savoir pour tre
tranquilles par la suite !
Pourquoi les formulaires ne sont pas s rs
Tout ce que nous avons appris dans le chapitre pr c dent sur les URL reste valable ici. Toutes les informations qui
proviennent de l'utilisateur, savoir les donn es de $_GET et de $_POST , doivent tre trait es avec la plus grande
m fiance.
Vous ne pouvez pas supposer que vous allez recevoir ce que vous attendiez.
Cette r gle est tr s simple, mais je vous propose un exemple concret pour bien visualiser le probl me. Imaginez que
vous demandez vos visiteurs de rentrer dans un champ leur date de naissance au format JJ/MM/AAAA. Combien vont
respecter cette mise en forme ? Combien vont se tromper par erreur ? Je vous garantis que parmi tous vos visiteurs,
alors que vous attendiez quelque chose comme 04/10/1987 , vous allez tomber sur une personne qui va crire : Je
suis n le 4 octobre 1987 . C'est un exemple un peu extr me mais a va vous arriver, soyez-en s rs. Par cons quent,
quand vous ferez le traitement de la date en PHP, il faudra bien v rifier qu'elle respecte le format que vous avez
indiqu .
Pour v rifier si une cha ne de texte correspond un certain format, comme JJ/MM/AAAA , on peut utiliser
une validation par expression r guli re. Les expressions r guli res feront l'objet de deux chapitres vers la fin
de ce livre car il s'agit d'un sujet assez complexe.
De la m me mani re, comme dans le chapitre pr c dent, m me si vous demandez un nombre compris entre 1 et 100,
il y aura bien quelqu'un pour crire 48451254523 . Soyez donc vigilants et n'ayez jamais confiance en ce qui vient de
l'utilisateur, savoir les donn es issues des arrays $_GET et $_POST .
Avec les formulaires, vous ne pouvez pas non plus supposer qu'on va vous envoyer tous les champs que vous
attendiez. Un visiteur peut tr s bien s'amuser supprimer un champ de texte, et dans ce cas votre page cible.php
ne recevra jamais le texte qu'elle attendait ! Il faudra imp rativement qu'elle v rifie que toutes les donn es qu'elle
attendait sont bien l avant d'effectuer la moindre op ration.
Puisque la page du formulaire se trouve sur mon site, comment peut faire un visiteur pour modifier ma page
web ? Il peut voir les sources mais pas les modifier !
En effet, vos visiteurs ne peuvent pas modifier vos pages web sur le serveur& Mais ils peuvent les reprendre et les
modifier ailleurs.
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
9/21
30/12/2015
Transmettre des donn es avec les formulaires
Souvenez-vous du sch ma de la figure suivante :
La page formulaire.php contient le formulaire et cible.php traite les donn es qu'on lui a envoy es. Autant le
code PHP n'est jamais visible par vos visiteurs, autant le code HTML du formulaire, lui, peut tre vu par tout le monde.
partir de l , qu'est-ce qui emp che quelqu'un de cr er une copie l g rement modifi e de votre formulaire et de la
stocker sur son serveur, l'image de la figure suivante ?
Le formulaire modifi
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
10/21
30/12/2015
Transmettre des donn es avec les formulaires
Sur le sch ma de la figure suivante, le m chant (nous l'appellerons comme a, parce que a lui va bien. ;-)) a pris le
code HTML de votre formulaire, l'a modifi et l'a enregistr sur son serveur (ou m me sur son ordinateur). L'attribut
action a t modifi pour indiquer l'adresse absolue (donc compl te) de votre page cible :
php
1
<form method="post" action="http://www.monsite.com/cible.php">
Le m chant peut maintenant modifier votre formulaire, ajouter des champs, en supprimer, bref faire ce qu'il veut
avec ! Votre page cible.php n'y verra que du feu car il est impossible de savoir avec certitude de quel formulaire
vient le visiteur.
Ces explications sont assez techniques. En fait, on les r serve normalement aux personnes plus exp riment es que les
d butants. Cependant, je tenais volontairement vous montrer comment c'est possible. M me si tout n'est pas
totalement clair dans votre t te, vous avez au moins l'id e du mode de fonctionnement.
S'il y a une chose retenir ici, c'est que les formulaires sont modifiables par tous les visiteurs contrairement ce
qu'on pourrait penser. Par cons quent, votre page cible.php devra tre aussi vigilante que nous l'avons t dans
le chapitre pr c dent et ne pas faire confiance aux donn es de l'utilisateur (les programmeurs ont d'ailleurs une
maxime : Never trust user input , ce qui signifie Ne faites jamais confiance aux donn es de l'utilisateur ).
Il y a un moyen encore plus simple de modifier le formulaire de votre site sans avoir acc s votre serveur.
Internet Explorer 8 et Google Chrome embarquent des outils pour les d veloppeurs qui permettent de
modifier le code HTML de la page que l'on visite en temps r el. Firefox peut faire de m me avec son c l bre
plugin Firebug.
La faille XSS : attention au code HTML que vous recevez !
Publicité
Il nous reste un dernier point important voir ensemble et apr s, j'arr te de vous faire peur, promis !
La faille XSS (pour cross-site scripting) est vieille comme le monde (euh, comme le Web) et on la trouve encore sur de
nombreux sites web, m me professionnels ! C'est une technique qui consiste injecter du code HTML contenant du
JavaScript dans vos pages pour le faire ex cuter vos visiteurs.
Reprenons la page qui affiche le pr nom qu'on lui envoie. Elle contient notamment le code suivant :
1
<p>Je sais comment tu t'appelles, h h . Tu t'appelles <?php echo $_POST['prenom']; ?> !</p>
php
Si le visiteur d cide d' crire du code HTML la place de son pr nom, cela fonctionnera tr s bien ! Par exemple,
imaginons qu'il crive dans le champ Pr nom le code : <strong>Badaboum</strong> . Le code source HTML qui
sera g n r par PHP sera le suivant :
1
<p>Je sais comment tu t'appelles, h h . Tu t'appelles <strong>Badaboum</strong> !</p>
php
Et alors ? S'il veut mettre son pr nom en gras, c'est son probl me, non ?
Outre le fait qu'il peut ins rer n'importe quel code HTML (et rendre votre page invalide), ce qui n'est pas le plus grave,
il peut aussi ouvrir des balises de type <script> pour faire ex cuter du code JavaScript au visiteur qui visualisera la
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
11/21
30/12/2015
page !
Transmettre des donn es avec les formulaires
1
<p>Je sais comment tu t'appelles, h h . Tu t'appelles <script
type="text/javascript">alert('Badaboum')</script> !</p>
php
Tous les visiteurs qui arriveront sur cette page verront une bo te de dialogue JavaScript s'afficher. Plut t g nant.
Voyez la figure suivante.
Ex cution de JavaScript par la faille XSS
Les choses deviennent vraiment critiques si le visiteur est assez malin pour r cup rer vos cookies de cette
fa on-l . Les cookies stockent des informations sur votre session et parfois des informations plus
confidentielles, comme votre pseudonyme et votre mot de passe sur le site ! Il est possible de forcer le visiteur
qui lira le code JavaScript envoyer tous les cookies qu'il a enregistr s pour votre site web, ce qui peut
conduire au vol de son compte sur ce site.
Je ne rentrerai pas dans le d tail de cette m thode car on s' loignerait un peu trop du sujet, mais sachez que
c'est possible et qu'il faut donc tout prix viter qu'un visiteur puisse injecter du code JavaScript dans vos
pages.
R soudre le probl me est facile : il faut prot ger le code HTML en l' chappant, c'est- -dire en affichant les balises (ou
en les retirant) plut t que de les faire ex cuter par le navigateur, comme sur la figure suivante.
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
12/21
30/12/2015
Transmettre des donn es avec les formulaires
viter la faille XSS en chappant le HTML
Pour chapper le code HTML, il suffit d'utiliser la fonction htmlspecialchars qui va transformer les chevrons des
balises HTML <> en < et > respectivement. Cela provoquera l'affichage de la balise plut t que son
ex cution.
1
<p>Je sais comment tu t'appelles, h h . Tu t'appelles <?php echo
htmlspecialchars($_POST['prenom']); ?> !</p>
Le code HTML qui en r sultera sera propre et prot g car les balises HTML ins r es par le visiteur auront t
chapp es :
1
Je sais comment tu t'appelles, h h . Tu t'appelles <strong>Badaboum</strong> !
php
php
Il faut penser utiliser cette fonction sur tous les textes envoy s par l'utilisateur qui sont susceptibles d' tre
affich s sur une page web. Sur un forum par exemple, il faut penser chapper les messages post s par vos
membres, mais aussi leurs pseudos (ils peuvent s'amuser y mettre du HTML !) ainsi que leurs signatures.
Bref, tout ce qui est affich et qui vient la base d'un visiteur, vous devez penser le prot ger avec
htmlspecialchars .
Si vous pr f rez retirer les balises HTML que le visiteur a tent d'envoyer plut t que de les afficher, utilisez la
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
13/21
30/12/2015
Transmettre des donn es avec les formulaires
fonction strip_tags .
L'envoi de fichiers
T
Vous saviez qu'on pouvait aussi envoyer des fichiers gr ce aux formulaires ? Vous aurez besoin de lire cette section si
vous voulez que vos visiteurs puissent envoyer (on dit aussi uploader) des images, des programmes ou tout autre type
de fichier sur votre site.
Cette section est un peu plus complexe que le reste du chapitre. Sa lecture n'est d'ailleurs pas obligatoire pour
la bonne compr hension de la suite du cours.
Par cons quent, n'h sitez pas revenir la lire plus tard, lorsque vous en aurez besoin, si vous ne voulez pas
vous attaquer de suite une partie un peu difficile .
L encore, a se passe en deux temps.
1. Le visiteur arrive sur votre formulaire et le remplit (en indiquant le fichier envoyer). Une simple page HTML
suffit pour cr er le formulaire.
2. PHP r ceptionne les donn es du formulaire et, s'il y a des fichiers dedans, il les enregistre dans un des
dossiers du serveur.
Attention : l'envoi du fichier peut tre un peu long si celui-ci est gros. Il faudra dire au visiteur de ne pas
s'impatienter pendant l'envoi.
On va commencer par cr er le formulaire permettant d'envoyer un fichier (une simple page HTML).
Nous verrons ensuite comment traiter l'envoi du fichier c t serveur avec PHP.
Le formulaire d'envoi de fichier
D s l'instant o votre formulaire propose aux visiteurs d'envoyer un fichier, il faut ajouter l'attribut
enctype="multipart/formdata" la balise <form> .
1
2
3
<form action="cible_envoi.php" method="post" enctype="multipart/formdata">
<p>Formulaire d'envoi de fichier</p>
</form>
Gr ce enctype , le navigateur du visiteur sait qu'il s'appr te envoyer des fichiers.
php
Maintenant que c'est fait, nous pouvons ajouter l'int rieur du formulaire une balise permettant d'envoyer un fichier.
C'est une balise tr s simple de type <input type="file" /> . Il faut penser comme toujours donner un nom ce
champ de formulaire (gr ce l'attribut name ) pour que PHP puisse reconna tre le champ par la suite.
php
1
2
3
4
<form action="cible_envoi.php" method="post" enctype="multipart/formdata">
<p>
Formulaire d'envoi de fichier :<br />
<input type="file" name="monfichier" /><br />
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
14/21
30/12/2015
Transmettre des donn es avec les formulaires
5
6
7
<input type="submit" value="Envoyer le fichier" />
</p>
</form>
Voil , c'est suffisant.
Publicité
Vous pouvez ajouter d'autres champs plus classiques au formulaire (champ de texte, cases cocher). Vous pouvez
aussi proposer d'envoyer plusieurs fichiers en m me temps.
L , on va se contenter d'un seul champ (envoi de fichier) pour faire simple.
Le traitement de l'envoi en PHP
Comme vous avez d le remarquer, le formulaire pointe vers une page PHP qui s'appelle cible_envoi.php . Le
visiteur sera donc redirig sur cette page apr s l'envoi du formulaire.
C'est maintenant que a devient important. Il faut que l'on crive le code de la page cible_envoi.php pour traiter
l'envoi du fichier.
Traiter l'envoi du fichier ? C'est- -dire ?
Si le fichier a t envoy sur le serveur c'est bon, non ? Qu'est-ce que PHP aurait besoin de faire ?
En fait, au moment o la page PHP s'ex cute, le fichier a t envoy sur le serveur mais il est stock dans un dossier
temporaire.
C'est vous de d cider si vous acceptez d finitivement le fichier ou non. Vous pouvez par exemple v rifier si le fichier a
la bonne extension (si vous demandiez une image et qu'on vous envoie un .txt , vous devrez refuser le fichier).
Si le fichier est bon, vous l'accepterez gr ce la fonction move_uploaded_file , et ce, d'une mani re d finitive.
Mais comment je sais si le fichier est bon ?
Pour chaque fichier envoy , une variable $_FILES['nom_du_champ'] est cr e. Dans notre cas, la variable
s'appellera $_FILES['monfichier'] .
Cette variable est un tableau qui contient plusieurs informations sur le fichier :
Variable
Signification
$_FILES['monfichier']
Contient le nom du fichier envoy par le visiteur.
['name']
$_FILES['monfichier']
['type']
Indique le type du fichier envoy . Si c'est une image gif par exemple, le type sera
image/gif .
$_FILES['monfichier']
['size']
Indique la taille du fichier envoy . Attention : cette taille est en octets. Il faut
environ 1 000 octets pour faire 1 Ko, et 1 000 000 d'octets pour faire 1 Mo.
Attention : la taille de l'envoi est limit e par PHP. Par d faut, impossible
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
15/21
30/12/2015
Transmettre des donn es avec les formulaires
d'uploader des fichiers de plus de 8 Mo.
$_FILES['monfichier']
['tmp_name']
Juste apr s l'envoi, le fichier est plac dans un r pertoire temporaire sur le
serveur en attendant que votre script
PHP d cide si oui ou non il accepte de
le stocker pour de bon. Cette variable
contient l'emplacement temporaire du
fichier (c'est PHP qui g re a).
$_FILES['monfichier']
['error']
Contient un code d'erreur permettant de savoir si l'envoi s'est bien effectu ou s'il
y a eu un probl me et si oui, lequel. La
variable vaut 0 s'il n'y a pas eu d'erreur.
Si vous avez mis un second champ d'envoi de fichier dans votre formulaire, il y aura une seconde variable
$_FILES['nom_de_votre_autre_champ'] d coup e de la m me mani re que le tableau qu'on vient de
voir ici.
$_FILES['nom_de_votre_autre_champ']['size'] contiendra donc la taille du second fichier, et ainsi
de suite.
Je vous propose de faire les v rifications suivantes pour d cider si l'on accepte le fichier ou non.
1. V rifier tout d'abord si le visiteur a bien envoy un fichier (en testant la variable $_FILES['monfichier']
avec isset() ) et s'il n'y a pas eu d'erreur d'envoi (gr ce $_FILES['monfichier']['error'] ).
2. V rifier si la taille du fichier ne d passe pas 1 Mo par exemple (environ 1 000 000 d'octets) gr ce
$_FILES['monfichier']['size'] .
3. V rifier si l'extension du fichier est autoris e (il faut interdire tout prix que les gens puissent envoyer des
fichiers PHP, sinon ils pourraient ex cuter des scripts sur votre serveur). Dans notre cas, nous autoriserons
seulement les images (fichiers .png, .jpg, .jpeg et .gif).
Nous analyserons pour cela la variable $_FILES['monfichier']['name'] .
Nous allons donc faire une s rie de tests dans notre page cible_envoi.php .
1/ Tester si le fichier a bien t envoy
On commence par v rifier qu'un fichier a t envoy . Pour cela, on va tester si la variable
$_FILES['monfichier'] existe avec isset() .
On v rifie dans le m me temps s'il n'y a pas d'erreur d'envoi.
1
2
3
4
5
6
<?php
// Testons si le fichier a bien t envoy et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
{
}
php
https://openclassrooms.com/courses/concevez votre site web avec php et mysql/transmettre des donnees avec les formulaires
16/21
30/12/2015
7
?>
2/ V rifier la taille du fichier
Transmettre des donn es avec les formulaires
On veut interdire que le fichier d passe 1 Mo, soient environ 1 000 000 d'octets (j'arrondis pour simplifier). On doit
donc tester $_FILES['monfichier']['size'] :
1
2
3
4
5
6
7
8
9
10
11
<?php
// Testons si le fichier a bien t envoy et s'il n'y a pas d'erreur
if (isset($_FILES['monfichier']) AND $_FILES['monfichier']['error'] == 0)
{
// Testons si le fichier n'est pas trop gros
if ($_FILES['monfichier']['size'] <= 1000000)
{
}
}
?>
3/ V rifier l'extension du fichier
On peut r cup rer l'extension du fichier dans une variable gr ce ce code :
1
2
3
4
<?php
$infosf...