Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
FORUM PHP FAQ PHP COURS PHP SOURCES PHP LIVRES PHP SCRIPTS PHP OUTILS PHP COMPARATIFS PHP TV Zend Framework

PHP et les formulaires

Date de publication : 31/05/2005 , Date de mise à jour : 12/10/2006

Par julp (Autres articles)
 

Les formulaires manipulés par PHP permettent d'alimenter un site mais aussi d'en gérer son contenu.

Ce tutoriel vous montrera comment utiliser chaque élément d'un formulaire : des zones de texte aux cases à cocher, ...


Introduction
1. Les champs de texte
2. Les zones de texte
3. Les boutons d'option
4. Les cases à cocher
5. Les listes déroulantes ...
5.1. ... à sélection simple
5.2. ... à sélection multiple
6. Approfondissements


Introduction

Le langage PHP permet de manipuler les formulaires : du contrôle de la saisie dans un champ à l'affichage simple de la saisie des différents champs. En général, c'est le formulaire de type POST qui sera utilisé, c'est ce type de formulaire que nous utiliserons dans les exemples de ce cours.

Il est extrêmement simple de récupérer dans une variable PHP, le contenu d'un champ. Cependant, il existe un cas un peu spécial : ce sont les cases à cocher car dans ce cas nous devons utiliser un tableau pour stocker les options qui ont été cochées par l'utilisateur. Donc, qu'il s'agisse d'un champ texte, d'une zone de texte, une liste déroulante ou encore un bouton d'option, la variable qui contiendra ce que l'utilisateur a entré sera $_POST["ce qui correspond à l'attribut name de la balise"]. Ainsi en PHP, une variable est créée automatiquement au nom du champ. Exemple :
<form method="POST">
    <input type="text" name="variable" .../>
</form>
Nous récupérerons le contenu de la ligne de texte dans la variable PHP $_POST['variable']. Cette façon de procéder sera la même pour tous les autres contrôles d'un formulaire sauf pour les cases à cocher !

Deuxième exemple avec différents contrôles :
<form method="POST">
    <input type="text" name="text" .../>
    <textarea name="textarea"></textarea>
    <input type="radio" name="radio"/>
    ...
</form>
On récupérera le contenu des différents contrôles de type text, textarea et radio respectivement dans les variables PHP suivantes : $_POST['text'], $_POST['textarea'], $_POST['radio'].

Par contre pour un ensemble de case à cocher, nous allons utiliser un tableau pour stocker les différentes valeurs. En effet, un même groupe de case à cocher peut nous donner plusieurs résultats comme un seul voire aucun. Voyons un exemple :
<form method="POST">
    <input type="checkbox" name="option[]"/>Option 1
    <input type="checkbox" name="option[]"/>Option 2
    <input type="checkbox" name="option[]"/>Option 3
</form>
Vous reconnaîtrez au premier coup d'oeil qu'il s'agit d'un tableau grâce à la présence de crochets ! La variable ou tableau qui accueillera le résultat sera donc $_POST['option']. Pour l'instant, c'est d'une simplicité enfantine, car tout est donné par l'attribut name de la balise.


1. Les champs de texte

Désormais, nous pouvons facilement afficher le contenu d'un champ de texte, en voici un exemple :

<?php
if (isset($_POST['mon_champ'])) {
?>
    Votre champ contenait :
    <b><?php echo $_POST['mon_champ']; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <input name="mon_champ" type="text"/>
    <input name="valider" type="submit" value="OK"/>
</form>
La fonction isset() nous permet de savoir si la variable $_POST['mon_champ'] existe. Or celle-ci n'existera que si le formulaire a été validé. Nous aurions pu indifféremment appliquer ce contrôle sur le bouton submit.

Passons au même exemple mais cette fois-ci avec réaffichage du formulaire et de son contenu :

<?php
// Forme ternaire ...
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
// ... dont la forme équivalente avec des if/else est :
//if (isset($_POST['mon_champ'])) {
//    $mon_champ = $_POST['mon_champ'];
//} else {
//    $mon_champ = '';
//}
 
if ($mon_champ) {
?>
    Votre champ contenait :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <input name="mon_champ" type="text" value="<?php echo $mon_champ; ?>"/>
    <input type="submit" value="OK"/>
</form>
J'ai utilisé une variable intermédiaire $mon_champ qui prend la valeur de $_POST['mon_champ'] lorsque le formulaire a été soumis (ou validé) (cas identifiable grâce à la fonction isset() - voir plus haut) et dans le cas contraire la chaîne vide qui sera considérée comme faux dans les tests (instructions if par exemple). Cela permet donc de simplifier le code si la saisie de ce champ est obligatoire, car les cas où le champ est vide ou le formulaire n'a pas été validé sont identiques du point de vue du résultat (ici un simple affichage de la saisie de l'utilisateur).

Il en va de même pour les champs de mot de passe. Il vous suffit de remplacer dans votre code HTML type="text" par type="password".


2. Les zones de texte

Nous allons commencer par un premier exemple, le plus simple : afficher le contenu de la zone de texte si celle-ci n'est pas vide !

<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
 
if ($mon_champ) {
?>
    Votre champ contenait :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <textarea name="mon_champ"></textarea>
    <input type="submit" value="OK"/>
</form>
Cet exemple, ne diffère guère du premier que nous avons vu avec les champs de texte. Un peu plus compliqué maintenant, car nous allons réaffiché dans le même contrôle son contenu :

<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
 
if ($mon_champ) {
?>
    Votre champ contenait :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <textarea name="mon_champ"><?php echo $mon_champ; ?></textarea>
    <input type="submit" value="OK"/>
</form>
Lorsque vous affichez quelque chose dans un textarea, faîtes attention de bien coller la balise de début et de fin du textarea, car dans certains cas vous aurez par exemple dans votre zone de texte soit des espaces ou un saut de ligne qui traîne. Vous pouvez dans ce cas utilisez la fonction trim().


3. Les boutons d'option

Le cas des boutons d'option est simple à gérer car pour un nombre quelconque de contrôles radio, c'est la même variable qui correspond. C'est donc cette variable qui contiendra ce que l'utilisateur a choisi. Voici, un premier exemple simple qui se contente d'afficher l'option choisie :

<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
 
if ($mon_champ) {
?>
    Vous avez choisi :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <input type="radio" name="mon_champ" value="Option 1"/>Option 1<br/>
    <input type="radio" name="mon_champ" value="Option 2"/>Option 2<br/>
    <input type="radio" name="mon_champ" value="Option 3"/>Option 3<br/>
    <input type="submit" value="OK"/>
</form>
Nous allons maintenant faire la même chose, mais l'option qui a été choisie sera sélectionnée à nouveau.

<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
 
if ($mon_champ) {
?>
    Vous avez choisi :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <input type="radio" name="mon_champ" value="Option 1" <?php if($mon_champ == "Option 1") { echo 'checked'; } ?>/>Option 1<br/>
    <input type="radio" name="mon_champ" value="Option 2" <?php if($mon_champ == "Option 2") { echo 'checked'; } ?>/>Option 2<br/>
    <input type="radio" name="mon_champ" value="Option 3" <?php if($mon_champ == "Option 3") { echo 'checked'; } ?>/>Option 3<br/>
    <input type="submit" value="OK"/>
</form>
L'utilisation d'un tableau aurait énormément simplifié le code ci-dessus. En effet, une boucle foreach permettrait de faire une unique condition qui permettrait de resélectionner celle que l'utilisateur a choisie car ce code devient vite pénible, lorsque les options se font plus nombreuses :
<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
 
// Les options du formulaire
$options = array(
    'Option 1',
    'Option 2',
    'Option 3'
);
 
if($mon_champ) {
?>
    Vous avez choisi :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <?php
    foreach ($options as $v) {
        if ($v == $mon_champ) {
            echo '<input type="radio" name="mon_champ" value="' . $v . '" checked/>' . $v . '<br/>';
        } else {
            echo '<input type="radio" name="mon_champ" value="' . $v . '"/>' . $v . '<br/>';
        }
    }
    ?>
   <input type="submit" value="OK"/>
</form>

4. Les cases à cocher

Voici la partie la plus complexe à maîtriser car elle fait nécessairement appel aux tableaux (vous pourrez alors utiliser les tableaux sur les boutons d'option par la suite pour vous facilitez la tâche). Nous allons dans un premier temps nous contenter d'afficher les options choisies par l'utilisateur :

<?php
if (isset($_POST['mon_champ'])) {
    echo "Vous avez choisi :";
    for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
        echo "<br/><b>" . $_POST['mon_champ'][$i] . "</b>";
    }
}
?>
 
<form method="POST">
    <input type="checkbox" name="mon_champ[]" value="Option 1"/>Option 1<br>
    <input type="checkbox" name="mon_champ[]" value="Option 2"/>Option 2<br>
    <input type="checkbox" name="mon_champ[]" value="Option 3"/>Option 3<br>
    <input type="submit" value="OK">
</form>
Il faut savoir que la variable $_POST['mon_champ'] est un tableau et qu'elle contient uniquement les valeurs que l'utilisateur à cocher. Notez bien la différence dans le formulaire, pour signifier que les cases cochées seront des éléments d'un tableau nous avons donc ajouté des crochets. Dans l'exemple suivant, nous allons réafficher dans le formulaire les cases sélectionnées par l'utilisateur. Encore une fois nous pourrions utiliser un autre tableau qui contiendrait toutes les cases du formulaire ce qui nous permettrait d'afficher la case cochée ou non dans une simple boucle foreach mais nous allons rester au plus simple pour que tout ceci soit plus clair !

<?php
if (isset($_POST['mon_champ'])) {
    echo "Vous avez choisi :";
    for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
        echo "<br/><b>" . $_POST['mon_champ'][$i] . "</b>";
    }
}
 
// Renvoie vrai si $option fait partie du résultat
function est_selectionne($option) {
    if (!isset($_POST['mon_champ'])) {
            return FALSE;
    }
    for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
        if ($_POST['mon_champ'][$i] == $option) {
            return TRUE;
        }
    }
    return FALSE;
}
?>
 
<form method="POST">
    <input type="checkbox" name="mon_champ[]" value="Option 1" <?php if(est_selectionne("Option 1")) { echo 'checked'; } ?>/>Option 1<br/>
    <input type="checkbox" name="mon_champ[]" value="Option 2" <?php if(est_selectionne("Option 2")) { echo 'checked'; } ?>/>Option 2<br/>
    <input type="checkbox" name="mon_champ[]" value="Option 3" <?php if(est_selectionne("Option 3")) { echo 'checked'; } ?>/>Option 3<br/>
    <input type="submit" value="OK"/>
</form>
Le dernier exemple est certes beaucoup plus compliqué, mais il vous suffira de faire une petite adaptation si vous en avez besoin !


5. Les listes déroulantes ...


5.1. ... à sélection simple

Les listes déroulantes sont couramment utilisées pour que l'utilisateur ne puisse sélectionner qu'une valeur. Ces choix sont souvent issus d'une base de données, c'est pourquoi nous verrons aussi un exemple avec une liste déroulante dont les options sont générées dynamiquement par PHP. Dans un premier temps nous allons simplement afficher, l'option qu'a choisi l'utilisateur :

<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
 
if ($mon_champ) {
?>
    Votre champ contenait :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <select name="mon_champ">
        <option>Option 1</option>
        <option>Option 2</option>
        <option>Option 3</option>
    </select>
    <input type="submit" value="OK"/>
</form>
Réaffichons maintenant l'option sélectionnée par l'utilisateur dans la liste déroulante :

<?php
$mon_champ = isset($_POST['mon_champ']) ? $_POST['mon_champ'] : '';
 
if ($mon_champ) {
?>
    Votre champ contenait :
    <b><?php echo $mon_champ; ?></b>
    <br/><br/>
<?php
}
?>
 
<form method="POST">
    <select name="mon_champ">
        <option <?php if($mon_champ == "Option 1") { echo 'selected'; } ?>>Option 1</option>
        <option <?php if($mon_champ == "Option 2") { echo 'selected'; } ?>>Option 2</option>
        <option <?php if($mon_champ == "Option 3") { echo 'selected'; } ?>>Option 3</option>
    </select>
    <input type="submit" value="OK"/>
</form>
Là encore nous aurions pu générer dynamiquement les options de la liste déroulante en les stockant dans un tableau et les traiter avec une boucle foreach ou for mais nous n'allons pas entrer dans les détails. Cependant comme je le disais précédemment, il est courant qu'une liste déroulante trouve ses options dans une base de données, en voici un petit exemple dont voici le contenu d'une table "langages" à titre d'exemple :

id langage
1 Java
2 C/C++
3 Delphi
4 Visual Basic
5 HTML
6 PHP
7 ASP

Ce système a pour but d'associer à un nombre unique (appelé identifiant) un langage. Il permet notamment à un utilisateur de sélectionner un langage sur la page d'index qui le renverra sur une page qui sera la même pour les autres langages, sauf que l'adresse de la page sera de la forme : http://www.mon-site.com/page.php?id=X. C'est ce X, qui va permettre d'identifier le langage que souhaite voir le visiteur. Ce nombre, permettra d'aller extraire relativement facilement tous les scripts par exemple du langage sélectionné. Il est plus simple d'utiliser un nombre qu'une chaîne qui peut nécessiter des traitements pour apparaître dans la barre d'adresse. Cependant, si un visiteur souhaite ajouter un script, il faudra bien l'insérer dans le bon langage, on affichera donc dans une liste déroulante des langages, mais les options auront pour valeurs leur identifiant respectif. Voici ce que cela nous donnerait en HTML :
<form method="POST">
    <select name="mon_champ">
        <option name="1">Java</option>
        <option name="2">C/C++</option>
        <option name="3">Delphi</option>
        <option name="4">VB</option>
        <option name="5">HTML</option>
        <option name="6">PHP</option>
        <option name="7">ASP</option>
    </select>
    <input type="submit" value="OK"/>
</form>
Nous supposerons que le webmaster a choisi d'utiliser le PHP pour générer le formulaire pour la simple et bonne raison que la liste des langages risque d'être souvent mise à jour. Nous possédons donc toutes les informations nécessaires pour coder ceci en PHP (Nous utiliserons le réaffichage du formulaire en cas d'erreur de la part de l'utilisateur) :
<?php
// Configuration de la connexion à la base de données
define('MYSQL_HOTE', 'localhost');
define('MYSQL_UTILISATEUR', 'root');
define('MYSQL_MOT_DE_PASSE', '');
define('MYSQL_BASE_DE_DONNEES', 'mysql');
 
$choix = isset($_POST['choix']) ? $_POST['choix'] : '';
 
// ...
 
// Connexion à la base de donnée
mysql_connect(MYSQL_HOTE, MYSQL_UTILISATEUR, MYSQL_MOT_DE_PASSE) or die('<h1>Connexion au serveur impossible !</h1>');
mysql_select_db(MYSQL_BASE_DE_DONNEES) or die('<h1>Connexion impossible à la base</h1>');
 
// Affichage du langage choisi
if ($choix) {
    $query = mysql_query("SELECT langage FROM langages WHERE id='$choix';") or die (mysql_error());
    $array = mysql_fetch_array($recup_langage);
    echo 'Vous avez choisi le langage : ' . $array['langage'];
}
 
// Début du script
$query = mysql_query("SELECT * FROM langages;") or die (mysql_error());
if ($query) {
    echo '<form method="post">';
    echo '<select name="choix">';
    while ($array = mysql_fetch_array($query)) {
        if ($choix == $array["id"]) {
            echo '<option value="' . $array['id'] . '" selected>' . $array['langage'] . '</option>';
        } else {
            echo '<option value="'.$array['id'] . '">' . $array['langage'] . '</option>';
        }
    }
    echo '</select>';
    echo '<input type="submit" value="OK">';
    echo '</form>';
}
 
mysql_close();
 
// ...
?>
Il faut avouer que ce dernier exemple est un peu trop compliqué pour des débutants, mais son but était de vous montrer l'intérêt des formulaires générer dynamiquement avec PHP depuis une base de données, ce qui est assez courant comme dans ce cas !


5.2. ... à sélection multiple

Les listes déroulantes peuvent également être utilisées pour permettre de sélectionner plusieurs valeurs (voire une ou pas du tout). Ce cas est strictement identique aux cases à cocher puisque l'on récupérera au final une variable "tableau" qui hébergera le résultat. Voyons un premier exemple avec un simple réaffichage des valeurs sélectionnées par l'utilisateur :

<?php
// Nos options définies dans un tableau (plus facile à coder et à maintenir)
$options = array(
    'Option 1',
    'Option 2',
    'Option 3',
    'Option 4'
);
 
// Affichage de la sélection seulement si le formulaire a été validé
if (isset($_POST['mon_champ'])) {
    echo "Vous avez choisi :";
    for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
        echo '<br/><b>' . $_POST['mon_champ'][$i] . '</b>';
    }
}
?>
 
<form method="POST">
    <select name="mon_champ[]" size="4" multiple>
        <?php
        foreach ($options as $k) {
            echo '<option>' . $k . '</option>';
        }
        ?>
    </select>
    <input type="submit" value="OK"/>
</form>
Modifions maintenant l'exemple précédent afin de réafficher ce que l'utilisateur a sélectionné :

<?php
// Nos options définies dans un tableau (plus facile à coder et à maintenir)
$options = array(
    'Option 1',
    'Option 2',
    'Option 3',
    'Option 4'
);
 
// Affichage de la sélection seulement si le formulaire a été validé
if (isset($_POST['mon_champ'])) {
    echo "Vous avez choisi :";
    for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
        echo '<br/><b>' . $_POST['mon_champ'][$i] . '</b>';
    }
}
 
function est_selectionne($option) {
    for ($i = 0, $c = count($_POST['mon_champ']); $i < $c; $i++) {
        if ($_POST['mon_champ'][$i] == $option) {
            return TRUE;
        }
    }
    return FALSE;
}
?>
 
<form method="POST">
    <select name="mon_champ[]" size="4" multiple>
        <?php
        foreach ($options as $k) {
            if (isset($_POST['mon_champ']) && est_selectionne($k)) {
                echo '<option selected>' . $k . '</option>';
            } else {
                echo '<option>' . $k . '</option>';
            }
        }
        ?>
    </select>
    <input type="submit" value="OK"/>
</form>

6. Approfondissements

Pour éviter que des petits malins ne glissent des balises HTML dont certaines peuvent être gênantes (<script>, <?, ...) je vous recommande de traiter vos formulaires à l'aide d'une de ces fonctions :

Lorsque vous attendez un nombre entier, vous pouvez utiliser la fonction intval() ainsi les chaînes de caractère non valides donneront la valeur zéro.

Selon la configuration du serveur, vous pourrez remarquer que certains caractères sont échappés (précédés par le caractère backslash (\)) comme le backslash lui-même ou encore l'apostrophe. La fonction get_magic_quotes_gpc() vous permet de savoir si c'est le cas et la fonction stripslashes() vous permet de les supprimer. Toutefois, lors d'une insertion en base de données du texte issu d'un formulaire vous devez impérativement échapper les caractères spéciaux (apostrophe, backslash, ...) si ce n'est pas déjà fait (à l'aide de fonctions comme addslashes() ou mysql_real_escape_string() ou mysqli_real_escape_string()).



Valid XHTML 1.1!Valid CSS!

Copyright © 2006 julp. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsable bénévole de la rubrique PHP : Guillaume Rossolini - Contacter par EMail :
Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.