IFT1147
Programmation Serveur Web avec PHP
Interaction avec l’usager:
get, post et les formulaires
IFT1147 - Interaction avec l'usager 2
Plan
Liens avec paramètres
Formulaires HTML et le protocole HTTP
Get ou Post ?
Formulaires HTML - les champs d’entrée
PHP et les formulaires
Expressions régulières
Téléchargement de fichiers
Liens
Des paramètres peuvent être ajoutés aux liens …
IFT1147 - Interaction avec l'usager 4
GET
La façon la plus simple de créer une interaction avec l’usager du site est d’inclure des informations dans un lien
<a href="abc.php?var1=val1&var2=val2">
Ces informations sont disponibles en PHP dans le tableau associatif $_GET.
echo $_GET["var1"];
IFT1147 - Interaction avec l'usager 5
Bonnes pratiques
Il faut absolument vérifier toute valeur reçue de la part d’un usager (par exemple dans $_GET).
La variable est-elle initialisée ?
La variable est-elle du bon type ?
La variable contient-elle une valeur raisonnable ?
IFT1147 - Interaction avec l'usager 6
Bonnes pratiques
Il n’est pas suffisant, pour la sécurité, de se dire que la valeur que vous recevez dans $_GET provient d’un lien que vous avez vous-même créé.
Le code source de la page HTML peut avoir été modifié localement par l’usager.
Il est facile de créer une requête get, même sans se servir d’un navigateur !
Formulaires HTML La théorie d’abord
IFT1147 - Interaction avec l'usager 8
Formulaires HTML
Le langage HTML permet de définir des formulaires en se servant du conteneur
<form>.
On peut ainsi créer des pages beaucoup plus interactives qu’avec seulement des liens (qui ne permettent après tout qu’un choix parmi des options prédéfinies) !
IFT1147 - Interaction avec l'usager 9
Formulaires HTML
Le conteneur <form> accepte plusieurs arguments:
action: l’URL du script de traitement
method: post ou get
get inclut les paramètres dans l’URL, directement visibles pour l’usager
post inclut les paramètres dans le corps de la requête HTTP.
Le protocole HTTP Une parenthèse s’impose …
IFT1147 - Interaction avec l'usager 11
Comment observer les échanges HTTP
Une façon simple et rapide pour voir les échanges HTTP entre navigateur et serveur Web est d’installer Firefox (http://www.mozilla.org)
Et d’ajouter ensuite l’extension LiveHTTPHeaders
(http://livehttpheaders.mozdev.org)
IFT1147 - Interaction avec l'usager 12
Requête HTTP
GET /~dift1147/index.php HTTP/1.1 Host: www-desi.iro.umontreal.ca User-Agent: Mozilla/5.0 (Macintosh; U;
PPC Mac OS X Mach-O; en-US; rv:1.7) Gecko/20040803 Firefox/0.9.3 Accept: text/xml,application/xml, application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300
Connection: keep-alive
IFT1147 - Interaction avec l'usager 13
Réponse HTTP
HTTP/1.x 200 OK
Date: Tue, 31 Aug 2004 00:32:10 GMT Server: Apache/2.0.50 (Fedora) X-Powered-By: PHP/4.3.8 Content-Length: 3425 Connection: close
Content-Type: text/html; charset=ISO-8859-1
Un code de retour de 200 indique que la transaction s’est terminée avec succès.
IFT1147 - Interaction avec l'usager 14
Réponse HTTP - document introuvable
HTTP/1.x 404 Not Found
Date: Tue, 31 Aug 2004 00:38:29 GMT Server: Apache/2.0.50 (Fedora) Content-Length: 310
Connection: close
Content-Type: text/html; charset=iso-8859-1
Le code 404 indique que le document demandé ne peut pas être trouvé.
IFT1147 - Interaction avec l'usager 15
Réponse HTTP - accès interdit
HTTP/1.x 403 Forbidden
Date: Tue, 31 Aug 2004 00:38:29 GMT Server: Apache/2.0.50 (Fedora) Content-Length: 316
Connection: close
Content-Type: text/html; charset=iso-8859-1
Le code 403 indique que l’accès au document est interdit.
IFT1147 - Interaction avec l'usager 16
Requête get
GET /~dift1147/exemples/Formulaires/get.php?
champCache=123&nom=Dominik&password=
&sexe=m&cours%5B%5D=1146&cours%5B%5D=1147 &disponibilite%5B%5D=lu&commentaire= HTTP/1.1 Host: www-desi.iro.umontreal.ca
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Referer: http://www-desi.iro.umontreal.ca/~dift1147/
exemples/Formulaires/baseGet.php
IFT1147 - Interaction avec l'usager 17
Requête post
POST /~dift1147/exemples/Formulaires/post.php HTTP/1.1
Host: www-desi.iro.umontreal.ca
Referer: http://www-desi.iro.umontreal.ca/~dift1147 /exemples/Formulaires/basePost.php
Content-Type: application/x-www-form-urlencoded Content-Length: 113
champCache=123&nom=Dominik&password=&sexe=m &cours%5B%5D=1146&cours%5B%5D=1147 &disponibilite%5B%5D=lu&commentaire=
get ou post ? Quelles sont les avantages
de chacun ?
IFT1147 - Interaction avec l'usager 19
Avantages de get vs post
Il est facile de transmettre des paramètres dans un lien.
On n’a pas besoin de créer de formulaire.
L’usager n’a pas besoin de cliquer sur un bouton.
Avec get, les arguments sont
automatiquement sauvegardés dans un favori (bookmark).
IFT1147 - Interaction avec l'usager 20
Avantages de post vs get
La longueur maximale de l’URL est assez limitée. S’il y a beaucoup de paramètres, une transmission par get est donc tout simplement impossible.
Les arguments transmis par get sont directement visibles dans la barre d’adresses; ce n’est pas un bon choix pour des données sensibles.
IFT1147 - Interaction avec l'usager 21
Avantage ou désavantage ?
Lorsque l’usager demande au navigateur de recharger la page actuelle, celui-ci
Le fait sans poser de questions lorsque les paramètres sont transmis par get.
Demande une confirmation lorsque les paramètres sont transmis par post. Selon le cas, ceci peut être un avantage ou un désavantage …
IFT1147 - Interaction avec l'usager 22
get ou post ?
Puisqu’une requête get peut être sauvegardée comme favori, ce n’est pas un bon choix pour tout formulaire qui entraîne une modification dans une base de données comme par exemple une confirmation d’achat.
« get pour la consultation, post pour la modification. »
IFT1147 - Interaction avec l'usager 23
Et la sécurité ?
Des arguments transmis par post peuvent tout aussi facilement avoir été modifiés par l’usager que ceux transmis par get.
Il ne faut jamais oublier qu’on peut facilement créer des requêtes HTTP à volonté en programmation. Il faut s’attendre à tout !
Formulaires HTML Les champs d’entrée
IFT1147 - Interaction avec l'usager 25
Champs d’entrée
<input type= "file">
Fichier
<textarea></textarea>
Zone de texte
<select><option></select>
Zone de liste
<input type= "checkbox">
Case à cocher
<input type= "radio">
Bouton d’option
<input type= "hidden">
Champ invisible
<input type= "password">
Mot de passe
<input type= "text">
Champ de saisie
IFT1147 - Interaction avec l'usager 26
text, password
nom="nom"
le nom du champ
value="valeur"
valeur par défaut
size="longeur"
nombre de caractères affichés
maxlength="longueur"
nombre maximal de caractères
IFT1147 - Interaction avec l'usager 27
radio
Permet un seul choix parmi plusieurs options
nom="nom"
le nom du champ
value="valeur"
valeur par défaut
checked si l’option est sélectionné par défaut.
IFT1147 - Interaction avec l'usager 28
checkbox
Permet une sélection multiple
nom="nom"
le nom du champ; il doit se terminer par []
value="valeur"
valeur par défaut
checked si l’option est cochée par défaut.
IFT1147 - Interaction avec l'usager 29
select
Liste déroulante
nom="nom"
le nom du champ; il doit se terminer par []pour une sélection multiple
multiple si sélection multiple
Chaque option est spécifiée par
<option>
IFT1147 - Interaction avec l'usager 30
Boutons
Bouton permettant de soumettre le formulaire:
<input type="submit">
Bouton permettant de réinitialiser le formulaire
<input type="reset">
PHP et les formulaires
Comment traiter toutes ces informations côté serveur ?
IFT1147 - Interaction avec l'usager 32
PHP et les formulaires
Si le formulaire est soumis par post, les variables sont disponibles en PHP dans
$_POST
Si le formulaire est soumis par get, les variables sont disponibles dans $_GET.
Dans les deux cas, les variables sont aussi disponibles dans $_REQUEST.
IFT1147 - Interaction avec l'usager 33
Avec une seule page PHP
Souvent, le formulaire est généré et traité par la même page PHP
Avantage:
lorsqu’on doit le modifier, on n’oublie pas de modifier aussi le code de validation et de traitement
Lorsqu’il est mal rempli, on peut facilement réafficher le formulaire avec un message d’erreur.
IFT1147 - Interaction avec l'usager 34
Avec une seule page PHP
Dans ce cas, on spécifie comme action du formulaire
<?=$_SERVER["PHP_SELF"]?>
Afficher le formulaire ou le traiter ?
On inclut un champ caché dans le formulaire
Traitement si et seulement si le champ caché fait partie de $_GET / $_POST.
IFT1147 - Interaction avec l'usager 35
Validation de formulaires
Avant de traiter les contenus d’un formulaire (afin de le sauvegarder dans une base de données par exemple), il faut le valider.
Toute validation doit se faire côté serveur. Une validation côté client (Javascript) peut aussi être faite, mais ne devrait jamais être utilisée seule !
IFT1147 - Interaction avec l'usager 36
Formulaires HTML et PHP - recette
Créez les fonctions
afficherFormulaire($erreurs), validerFormulaire() et
traiterFormulaire()
Ajoutez dans le formulaire un champ caché de nom soumis
IFT1147 - Interaction avec l'usager 37
Formulaires HTML et PHP - recette
if (array_key_exists("soumis", $_POST)) { if (($erreurs = validerFormulaire()) === true) { traiterFormulaire();
} else {
afficherFormulaire($erreurs);
} } else {
afficherFormulaire();
}
Expressions régulières
ou comment décrire des motifs de caractères…
IFT1147 - Interaction avec l'usager 39
Expressions régulières
Une expression régulière représente un motif de caractères.
Elles sont particulièrement utiles afin de vérifier les données de formulaires.
De façon plus générale, elles peuvent être utilisées pour toute recherche et modification de texte de toute sorte.
IFT1147 - Interaction avec l'usager 40
La base
^ indique le début d’une chaîne
$ indique la fin d’une chaîne
. peut être n’importe quel caractère
Chaîne abc
^abc$
Chaîne finissant par abc abc$
Chaîne commencant par abc
^abc
Chaîne contenant abc abc
IFT1147 - Interaction avec l'usager 41
Classes de caractères
Permet de spécifier un choix.
[…] un des caractères spécifiés
[^…] tout sauf un des caractères
pap ou pbp ou … sauf php
^p[^h]p$
aAa ou aBa ou … ou aZa
^a[A-Z]a$
a0a ou a1a ou … ou a9a
^a[0-9]a$
aaa ou aba ou aca
^a[abc]a$
IFT1147 - Interaction avec l'usager 42
Répétitions
{n,m} entre n et m fois
{n,} au moins n fois
{n} exactement n fois
? 0 ou 1 fois
+ au moins une fois
* 0 ou plus de fois
IFT1147 - Interaction avec l'usager 43
Répétitions - exemple
php ou php3 ou php4
^php[34]?$
Un entier
^[0-9]+$
Tout mot entre 1 et 3 lettres
^.{1,3}$
Tout mot de 5 lettres
^.{5}$
IFT1147 - Interaction avec l'usager 44
Groupement
| permet de spécifier des alternatives
() permet de regrouper plusieurs caractères
php ou php3 (php)|(php3)
IFT1147 - Interaction avec l'usager 45
Expressions régulières et PHP
Les fonctions ereg et eregi permettent de vérifier si une chaîne de caractères est conforme à une expression régulière.
if (ereg($regExp, $chaine)) { //valide
}
Téléchargement de fichiers
http://www.php.net/manual/fr/features.file-upload.php
IFT1147 - Interaction avec l'usager 47
Le côté HTML
Il faut déclarer le formulaire qui servira à télécharger le fichier de la façon suivante
<form enctype="multipart/form-data"
action="<?=$_SERVER["PHP_SELF"]?>"
method="post">
Envoyez votre image:
<input name="imageUsager" type="file">
<input type="submit" value="Envoyer">
</form>
IFT1147 - Interaction avec l'usager 48
Le tableau $_FILES
Le tableau associatif $_FILES contient les informations concernant les fichiers qui ont été téléchargés.
$_FILES['image_usager']['tmp_name']
le nom du fichier sur le serveur
$_FILES['image_usager']['name']
le nom du fichier ‘original’
$_FILES['image_usager'][’size']
la grandeur du fichier
IFT1147 - Interaction avec l'usager 49
Le traitement des fichiers en PHP
Lorsque reçus par le serveur, les fichiers téléchargés sont placés dans un
répertoire temporaire.
À la fin de l’exécution du code PHP, ces fichiers sont automatiquement détruits.
Si on veut les garder, il faut absolument les déplacer (move_uploaded_file()).
IFT1147 - Interaction avec l'usager 50
Les droits d’accès
Les fichiers téléchargés vont être créés sur le disque du serveur Web par l’usager ‘apache’.
Afin de pouvoir se servir de la fonction move_uploaded_file() il faut donc créér un répertoire avec les droits d’accès 777.
Il n’est généralement pas une bonne idée d’y placer du code PHP !
IFT1147 - Interaction avec l'usager 51
Les noms de fichiers
Afin d’éviter d’écraser des fichiers déjà existants lors de l’utilisation de
move_uploaded_file, il faut créer un nouveau nom de fichier.
Ceci peut être fait soit manuellement avec une chaîne de caractères aléatoire, ou, beaucoup plus simple, en faisant appel à tempnam().