Transmettre des données avec les formulaires

Web Development · course

Voir tous les documents en développement web

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 &lt; et &gt; 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...