PHP Facile!
existe aussi en version
SQL et XML

6.Le langage PHP

6.11.Les formulaires

6.11.1.Passage de paramètres

A de nombreux moments de la réalisation de vos scripts PHP vous serez amenés à passer des paramètres et donc à les gérer. Ces paramètres peuvent être, le numéro de la page de résultats à afficher, l'identifiant de la personne qui souhaite se connecter au site, etc.
La façon la plus simple de passer des paramètres est d'ajouter dans l'URL, après le nom du script, une chaîne de la forme ?param1=valeur1&param2=valeur2&.... Au sein du script PHP, vous pourrez récupérer ces valeurs en accédant à la variable un peu particulières $_GET. Cette variable contient un tableau dit associatif où les clés du tableau sont les noms des paramètres (ici, "param1" et "param2") et les valeurs associées à ces clés sont les valeurs de ces même paramètres (autrement dit $_GET["param1"] vaut "valeur1" et $_GET["param2"] vaut "valeur2").
Un petit exemple pour le démontrer ?
<?php
echo "Bonjour".$_GET["id"];
?>
Vous n'avez qu'à le sauvegarder sous le nom testget.php et accéder à l'adresse http://localhost/testget.php?id=toi pour le tester. Faites des appels avec différentes valeurs de id pour en démontrer le fonctionnement.
  • Avant PHP 4.1, il fallait utiliser le tableau $HTTP_GET_VARS (à la place de $_GET)
  • Avant PHP 4.2, l'option register_globals (définie dans le fichier php.ini) était par défaut fixée à On. De ce fait, les paramètres était directement accessibles en utilisant la variable de même nom (ex: $param1 et $param2). Pour raisons de sécurité, ce n'est plus la configuration par défaut.
Cette façon d'appeler le script avec des paramètres est bien adaptée à certains cas de figure, comme par exemple pour créer un lien vers la Nième page de résultats (ex: <a href="resultats.php?page=3">Page 3</a>). Mais si l'on reprend le cas de figure de l'exemple, vous n'allez pas demander aux visiteurs de votre site de modifier l'URL pour préciser leur identifiant via le paramètre id. A la place, vous devez mettre en place un formulaire.

6.11.2.Rappel HTML

Comme vous le savez sans doute un formulaire HTML [c'est quoi?] se déclare entre les balises <form>. Un champ texte peut être inséré avec une balise <input type="text"> et un bouton de validation avec une balise <input type="submit">
<html>
<head>
    <title>TEF: Formulaire</title>
</head>
<body>
    <p>Veuillez vous identifier</p>
    <form>
        Nom: <input type="text" name="nom" /><br />
        Prénom: <input type="text" name="prenom" /><br />
        <input type="submit" value="OK" />
    </form>
</body>
</html>
Si vous remplissez et validez ce formulaire, vous constaterez que la page contenant le formulaire se recharge et que l'URL se termine désormais par: ?nom=<la valeur que vous avez saisie>&prenom=<la valeur que vous avez saisie>
C'est exactement le même principe que le passage de paramètres vu précédemment. On dit alors que les paramètres sont passés par la méthode GET (paramètres passés par l'URL). C'est la méthode par défaut du formulaire.
  • Il est possible d'appeler une autre page que le formulaire lui-même en spécifiant l'attribut action de la balise <form>.
  • Il est possible de spécifier un passage des paramètres par la méthode POST en spécifiant method="post" dans la balise <form>.
  • Les noms des paramètres sont ceux indiqués par les attributs name des balises <input>.
  • Il est possible de spécifier des valeurs par défaut pour ces paramètres en utilisant l'attribut value des balises <input>.

6.11.3.Récupérer les valeurs des champs d'un formulaire HTML

Reprenons le formulaire précédent et faisons en sorte qu'il appelle un script chargé d'afficher les deux informations fournies (nom et prénom).
<html>
<head>
    <title>TEF: Formulaire</title>
</head>
<body>
    <p>Veuillez vous identifier</p>
    <form action="formulaire_02.php">
        Nom: <input type="text" name="nom" /><br />
        Prénom: <input type="text" name="prenom" /><br />
        <input type="submit" value="OK" />
    </form>
</body>
</html>
Le script d'affichage pourra alors être
<html>
<body>
<h1>Informations saisies</h1>
<?php
    // Récupération de données passées par la méthode GET
    // pour PHP >= 4.1
    echo "Nom: ".$_GET["nom"]."<br />";
    echo "Prénom: ".$_GET["prenom"]."<br />";
?> 
</body>
</html>
Il n'y a finalement rien de véritablement nouveau, juste un peu plus de code HTML.

6.11.4.Magic quotes (avec PHP avant 5.3.0)

L'exemple précédent va nous permettre d'en apprendre un peu plus sur la gestion des formulaires via PHP. Amusez-vous à saisir un nom contenant une apostrophe (ex: Aujourd'hui), validez le formulaire. Qu'observez-vous? Si vous avait une version de PHP précédent la version 5.3.0, alors vous obtenez très probablement une ligne contenant "Nom: Aujourd\'hui". C'est en effet, le comportement par défaut tel que défini dans le fichier php.ini via la paramètre magic_quotes_gpc. Les paramètres passés par la méthode GET (mais aussi POST et les cookies, que nous verrons plus tard) sont manipulés pour ajouter un slash devant le délimiteur de chaînes qu'est l'apostrophe. Ce comportement est bien pratique lorsqu'il s'agit d'utiliser la valeur dans une requête SQL (comme nous verrons plus tard) mais est pour le moins disgracieux à l'affichage. Il aurait fallu en fait remplacer
echo "Nom: ".$_GET["nom"];
par
echo "Nom: ".stripSlashes($_GET["nom"]);
Comme vous l'avez compris la fonction stripSlashes() permet de supprimer les slashes ainsi ajoutés (il s'agit de l'opération inverse de addSlashes()). Même si ceci était pratique car évitait la nécessité de faire appel à la fonction mysql_escape_string() (ou addSlashes()) avant insertion d'une donnée dans une base MySQL (ou son équivalent pour un autre système de base de données), en revanche elle n'évitait pas l'appel à stripSlashes() avant affichage. Bref... au final, ça apportait plutôt de la confusion. Et depuis la version 5.3.0, cette option n'est plus activée par défaut. En d'autre termes, les données récupérées du formulaire n'intègrent plus de slash devant les apostrophes (il n'y a donc plus besoin de les retirer mais il faut les ajouter avant insertions en base).
  • Le problème c'est que maintenant, lorsque l'on écrit un script destiné a être utilisé sur n'importe quel serveur il faut être extrêmement prudent. Le script doit déterminer comment celui-ci est configuré ou forcer la configuration pour savoir s'il faut ou non ajouter des slashes. L'utilisation d'un framework (comme Zend Framework) pourra vous aider dans cette tâche.
  • Pour afficher, une valeur issue (notamment) d'un formulaire et pouvant contenir des caractères spéciaux comme le signe inférieur '<'. Il faudra faire appel à la fonction htmlEntities()
    echo "Nom: ".htmlEntities($chaine);
    ou si votre chaîne de caractères est encodée en UTF-8
    echo "Nom: ".htmlEntities($chaine, ENT_COMPAT, 'UTF-8');

6.11.5.Méthode POST?

L'utilisation de la méthode GET est très simple mais elle a ses limites.
Supposez que votre formulaire contienne de nombreux champs, prenant peut-être des valeurs à rallonge (comme par exemple un commentaire apporté à un livre). Sachant que champs et valeurs sont ajoutés à la fin de l'URL, celle-ci pourrait être bien longue au point d'être refusée par le serveur web. Dans ce cas, une alternative à la méthode GET est nécessaire.
Autre limitation, les valeurs passées sont clairement lisibles puisqu'elles appartiennent à l'URL. Elles s'affichent dans la barre de navigation, elles sont stockées dans les logs des serveurs, etc. La méthode GET n'est donc pas adaptée au passage d'information sensibles comme les mots de passe.
Pour faire face à ces contraintes, vous aurez donc à utiliser la méthode POST. Pour cela, il n'y a rien de plus simple. Il suffit de préciser l'attribut method="post" dans la balise form et d'accéder au contenu du tableau $_POST (à la place de $_GET). Tout le reste fonctionne à l'identique.

6.11.6.Les champs de formulaire autres que les champs texte

Le principe est le même pour tout autre élément qu'un champ texte (radio button, case à cocher, liste de selection) d'un formulaire, encore faut-il savoir comment ces derniers réagissent. Pour en avoir le coeur net, le plus simple est de créer un formulaire utilisant la méthode GET, s'appelant lui-même et voir comment est modifiée l'URL lorsque l'on valide le formulaire.

6.11.7.Radio buttons

Prenons ainsi l'exemple des "radio buttons".
<html>
<body>
<form>
    Etes-vous ?<br />
    <input type="radio" name="supercontent" />Super content<br />
    <input type="radio" name="content" />Content<br />
    <input type="radio" name="pascontent" />Pas content<br />
    <input type="radio" name="demauvaisehumeur" />De mauvaise humeur<br />
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>
Si vous sélectionnez un élément et que vous validez le formulaire, vous constaterez que l'URL appelée se termine alors par ?<nom du champ sélectionné>=on. Si vous procédez ainsi vous serez donc amené à tester la valeur de chacun des éléments du tableau $_GET[] correspondant aux noms des radio buttons (ex: $_GET["supercontent"], $_GET["content"], etc...). Bon... certes, ça marche mais ce n'est pas super pratique.
Heureusement, il est possible de préciser la valeur associée à un radio button (par défaut on) en utilisant l'attribut value. Il est ainsi possible d'avoir le formulaire suivant.
<html>
<body>
<form>
    Etes-vous ?<br />
    <input type="radio" name="moral" value="supercontent" />
        Super content<br />
    <input type="radio" name="moral" value="content" />
        Content<br />
    <input type="radio" name="moral" value="pascontent" />
        Pas content<br />
    <input type="radio" name="moral" value="demauvaisehumeur" />
        De mauvaise humeur<br />
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>
Cette fois ci, tous les radio buttons d'un même groupe possèdent le même nom mais la valeur associée varie de l'un à l'autre. Pour connaître le moral du visiteur, il suffit alors de faire appel à $_GET["moral"].

6.11.8.Checkboxes (cases à cocher)

Les cases à cocher fonctionnent à peu près sur le même principe que les "radio buttons" mais la différence majeure c'est qu'il est cette fois possible d'en cocher plusieurs.
<html>
<body>
<form>
    Qu'est-ce que vous aimer ?<br />
    <input type="checkbox" name="shopping" />Faire du shopping<br />
    <input type="checkbox" name="sport" />Faire du sport<br />
    <input type="checkbox" name="theatre" />Aller au théatre<br />
    <input type="checkbox" name="cinema" />Aller au cinéma<br />
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>
Si vous sélectionnez un ou plusieurs éléments et que vous validez le formulaire, vous constaterez que l'URL appelée se termine alors par ?<nom du 1er champ sélectionné>=on&<nom du 2nd champ sélectionné>=on. Il est donc possible de savoir si telle ou telle case a été cochée. Pour savoir si le visiteur aime faire du shopping il suffit de vérifier si $_GET["shopping"]=="on".
Tout comme pour les "radio buttons", il est possible de préciser la valeur associée à une case à cocher (par défaut on) en utilisant l'attribut value. Il est ainsi possible d'avoir le formulaire suivant.
<html>
<body>
<form>
    Qu'est-ce que vous aimer ?<br />
    <input type="checkbox" name="loisirs" value="shopping" />
    Faire du shopping<br />
    <input type="checkbox" name="loisirs" value="sport" />
    Faire du sport<br />
    <input type="checkbox" name="loisirs" value="theatre" />
    Aller au théatre<br />
    <input type="checkbox" name="loisirs" value="cinema" />
    Aller au cinéma<br />
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>
Cette fois ci, toutes les cases à cocher d'un même groupe possèdent le même nom mais la valeur associée varie de l'une à l'autre. Contrairement au cas des "radio buttons" utilisée telle quelle, cette méthode n'est pas appriopriée aux cases à cochée. En effet, dans ce cas la variable $_GET["loisirs"] ne contiendra que la valeur associée à la première case cochée.
Par contre, cela devient fort interessant dans le cas où vous spécifier un nom de tableau en tant qu'attribut name de la balise <input>, comme le montre l'exemple suivant.
<html>
<body>
<form action="formulaire_checkbox_03.php">
    Qu'est-ce que vous aimer ?<br />
    <input type="checkbox" name="loisirs[]" value="shopping" />
    Faire du shopping<br />
    <input type="checkbox" name="loisirs[]" value="sport" />
    Faire du sport<br />
    <input type="checkbox" name="loisirs[]" value="theatre" />
    Aller au théatre<br />
    <input type="checkbox" name="loisirs[]" value="cinema" />
    Aller au cinéma<br />
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>
Dans ce cas, $_GET["loisirs"] est un tableau contenant les valeurs des cases cochées. Il suffit alors de le parcourir comme dans l'exemple suivant:
<?php
    // Récupération de paramètres passés par la méthode GET
    // avec PHP>=4.1
    // $_GET["loisirs"] contient un tableau de valeurs
    $loisirs = $_GET["loisirs"];

    echo "<b>Vous aimez </b><br />";
    for ($i=0; $i<count($loisirs); $i++) {
        echo $loisirs[$i]."<br />";
    }
?>
<br />
Retour au formulaire,
<a href="formulaire_checkbox_03.html">Cliquez ici</a>

6.11.9.Select (liste de sélection)

6.11.9.1.Liste de sélection unique

Les listes de sélection (à sélection unique) fonctionnent à peu près sur le même principe que les "radio buttons" la seule différence vient du fait que la valeur par défaut n'est pas on mais le label de l'option sélectionnée.
<html>
<body>
<form>
    Etes-vous ?<br />
    <select name="moral">
        <option>Super content</option>
        <option>Content</option>
        <option>Pas content</option>
        <option>De mauvaise humeur</option>
    </select><br />
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>
Si vous validez le formulaire (après avoir fait votre choix), vous constaterez que l'URL appelée se termine alors par ?<nom associé à la balise select>=<label de l'option sélectionnée>. Il est donc possible de savoir quelle option a été sélectionnée en faisant appel à $_GET["moral"]. Toutefois travailler avec les labels n'est pas toujours chose très pratique (notamment si votre site est disponible en différentes langues). Heureusement, il est, là encore, possible de préciser la valeur associée à chaque option (ici, nous associons une note à chaque option).
<html>
<body>
<form>
    Etes-vous ?<br />
    <select name="moral">
        <option value="3">Super content</option>
        <option value="2">Content</option>
        <option value="1">Pas content</option>
        <option value="0">De mauvaise humeur</option>
    </select><br />
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>

6.11.9.2.Liste de sélection multiple

Tout comme pour les cases à cocher, la meilleure façon de gérer les liste de sélection multiple consiste à donner à la liste un nom de tableau comme suit:
<html>
<body>
<form action="formulaire_select_03.php">
    Qu'est-ce que vous aimer ?<br />
    <select name="loisirs[]" multiple="multiple">
        <option value="shopping">Faire du shopping</option>
        <option value="sport">Faire du sport</option>
        <option value="theatre">Aller au théatre</option>
        <option value="cinema">Aller au cinéma</option>
    </select>
    <input type="submit" value="Ma réponse"/>
</form>
</body>
</html>
Dans ce cas, $_GET["loisirs"] est un tableau contenant les valeurs des cases cochées. Il suffit alors de le parcourir comme dans l'exemple suivant:
<?php
    // Récupération de paramètres passés par la méthode GET
    // avec PHP>=4.1
    // $_GET["loisirs"] contient un tableau de valeurs
    $loisirs = $_GET["loisirs"];

    echo "<b>Vous aimez </b><br />";
    for ($i=0; $i<count($loisirs); $i++) {
        echo $loisirs[$i]."<br />";
    }
?>
<br />
Retour au formulaire,
<a href="formulaire_select_03.html">Cliquez ici</a>