Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
logo
Sommaire > Concepts fréquents > Formulaires
        À quel moment effectuer la vérification?
        Que faut-il vérifier ?
        Comment vérifier les données renvoyées par formulaire (POST) ?
        Pourquoi mes valeurs de champs textes de formulaires sont-elles coupées après le premier espace ?
        Contrôler et réafficher un formulaire avec les valeurs déjà saisies
        Comment afficher le contenu de POST/GET, SESSION ou SERVER ?
        Comment récupérer la position de la souris après un clic sur un submit de type image ?
        Comment gérer un formulaire avec deux submit ?
        Comment vérifier qu'une chaine comporte uniquement des chiffres et des opérateurs arithmétiques ?
        Comment conserver la sélection d'un menu déroulant après une soumission ?
        Comment extraire les valeurs d'un SELECT multiple ?
        Comment savoir combien de variables ont été postées ?
        Comment redéfinir comme valeur par défaut d'une liste multiple les choix effectués dans cette liste?
        Comment récupérer les informations d'un champ de type file ?
        Comment empêcher les méfaits du bouton actualiser (renvoi de formulaire) ?



À quel moment effectuer la vérification?
auteur : Eric Berger
a) Avant l'envoi du formulaire La vérification avant envoi ne peut se faire en PHP, PHP étant un langage serveur, elle devra donc être faite à l'aide d'un langage client, généralement javaScript. Cette vérification est utile dans le sens oû elle évite d'envoyé des données mal formatées vers le serveur, mais elle n'est pas fiable, car on ne peut contrèler de manière certaine le client et ce qu'il envoie (le javaScript peut être désactivé dans le navigateur, par exemple).

b) Avant enregistrement C'est le meilleur moment pour vérifier les données, ceci assure que les données enregistrées respectent les règles fixées. La vérification avant enregistrement ne doit cependant porter que sur la validité du format des données et leur compatibilité avec les outils et supports (bdd, php).

c) Avant l'utilisation À ce moment, les données devraient déjà être validées. Si ce n'était pas le cas, ça voudrait dire que des données invalides ont été sauvegardées, ce qui n'est pas acceptable. Il se peut cependant que des données doivent être préparées en vue d'une utilisation particulière, par exemple en supprimant les tags HTML pour l'affichage sur une page web. Dans ce cas seulement, une vérification des données se fera avant leur utilisation.


Que faut-il vérifier ?
auteur : Eric Berger
  • Les caractères interprétables par HTML et les caractères accentués ou spéciaux
    C'est la fonction htmlspecialchars() qui se charge de remplacer les caractères suivants* : & ' " < > par leur entité HTML. Cette fonction est également très utile si on veut présenter un exemple de code HTML dans une page web.

    Quant aux caractères accentués ou spéciaux, c'est la fonction htmlentities() qui est sollicitée. Elle fonctionne de la même manière que htmlspecialchars() mais s'applique à tous les caractères qui ont un équivalent en entité HTML. il est également possible d'ignorer les quote simples et doubles.

    * Il est possible de faire ignorer les quotes simple et doubles par la fonction.
  • Si on a à faire à une chaîne vide :
    Il est parfois utile de savoir si on a affaire à une chaîne vide, afin de ne pas enregistrer la donnée ou d'ajouter une valeur par défaut.
    En utilisant l'instruction suivante, il est possible de le savoir.
if(strlen($chaine) < 1){
    echo "la chaîne est vide";
} else {
    echo "la chaîne n'est pas vide";
}
lien : faq Comment se protéger de la faille XSS ?
lien : faq Comment se protéger des failles d'injection ?

Comment vérifier les données renvoyées par formulaire (POST) ?
auteur : Julp
Soit le champ de formulaire de méthode POST suivant :
<input type="text" name="mon_champ" ...>
Tester si $_POST["mon_champ"] est un entier :
if (is_numeric($_POST['mon_champ']) && (intval(0 + $_POST['mon_champ']) == $_POST['mon_champ'])) {
    echo 'Saisie correcte !';
} else {
    echo 'Saisie incorrecte !';
}
Tester si $_POST["mon_champ"] est un réel :
if(is_numeric($_POST['mon_champ'])) {
    echo 'Saisie correcte !';
} else {
    echo 'Saisie incorrecte !';
}
Tester si $_POST["mon_champ"] est une adresse email valide :
if (ereg('^.+@.+\\..+$', $_POST['mon_champ'])) {
    echo 'Email valide !';
} else {
    echo 'Email invalide !';
}

Pourquoi mes valeurs de champs textes de formulaires sont-elles coupées après le premier espace ?
auteur : Cyberzoide
La syntaxe d'un champ input de type text est la suivante :
<input type="text" name="nom" value="valeur" />
Selon la norme XHTML, les valeurs des attributs des balises doivent être délimitées par des doubles quotes.
Exemple exact :
<input type="text" name="nom" value="<?php echo $nom; ?>" />
Exemple inexact :
<input type="text" name="nom" value=<?php echo $nom; ?> />
Dans ce dernier exemple, si la variable $nom comporte des espaces, le navigateur n'interprétera pas le reste de la chaîne de caractères.

De même, si cette variable contient des doubles quotes, il faudra les déspécialiser avec la fonction htmlentities() ou htmlspecialchars(), sinon ils vont interférer avec les doubles quotes de délimitation de la valeur d'attribut.
Exemple :
<input type="text" name="nom" value="<?php echo htmlentities($nom); ?>" />
lien : faq Comment se protéger de la faille XSS ?

Contrôler et réafficher un formulaire avec les valeurs déjà saisies
auteur : f-demu01
Pour construire un formulaire simple sur ce modèle, il faut deux choses :

1 - A chaque élément du formulaire, donner comme attribut value la variable PHP correspondant à l'attribut name :
echo '<input type="text" name="nounours" value="' .$_POST['nounours']. '">' ;
Attention, cette option ne fonctionne pas (ou mal) avec les champs FILE, car pour des raisons de sécurité, elle est désactivée sur la plupart des navigateurs.

2 - effectuer le traitement et l'affichage du formulaire dans la même page.
$out ="";
if(!empty($_POST['nounours']) && isset($_POST['envoi'])) 
{
    $out .= 'Traitement du formulaire...<br><a href="' .$_SERVER['PHP_SELF']. '">Retour</a>';
} 
else 
{
    // Le formulaire est envoyé mais le champ nounours n'est pas rempli
    if(isset($_POST['nounours']) && (isset($_POST['envoi'])))  
    {
        $out .= 'vous n\'avez pas rempli le champ nounours';
    }
    $out .= '<form action="' .$_SERVER['PHP_SELF']. '" method="POST" enctype="application/x-www-form-urlencoded">
                        <input type="text" name="nounours" value="' .htmlentities($_POST['nounours']). '">
                        <input type="submit" name="envoi" value="OK">
                    </form>';
}
echo $out;
lien : fr Les formulaires et PHP5, par Guillaume Rossolini
lien : faq Comment se protéger de la faille XSS ?
lien : faq Comment se protéger des failles d'injection ?

Comment afficher le contenu de POST/GET, SESSION ou SERVER ?
auteur : Forum PHP
Cela peut être utile pour vérifier le contenu des données transmises par un formulaire quelque soit la méthode ($_GET ou $_POST).
On utilise donc la fonction print_r() qui affiche des informations à propos d'une variable, de manière à ce qu'elle soit lisible.
Exemple :
Vérification sur $_GET

echo '<pre>';
print_r($_GET); // Affiche tout le contenu de la variable $_GET
echo '</pre>';
                
Ce code peut également être utilisé pour afficher le contenu de $_POST, $_SESSION ou $_SERVER

lien : faq Comment afficher (pour vérification) le contenu d'un tableau ?

Comment récupérer la position de la souris après un clic sur un submit de type image ?
auteur : Jérôme
D'un point de vue purement esthétique, il est parfois préférable d'utiliser un bouton image plutôt qu'un banal bouton submit pour envoyer un formulaire.
<form method="post" action="page.php">
    ...
    <input type="image" name="img_envoi" src="image_envoi.gif">
</form>
Après envoi de ce formulaire en ayant cliqué sur l'image, on récupère les coordonnées du point sur l'image, là où a été effectué le clic de souris, les coordonnées étant calculées par rapport au point 0,0 de l'image (haut gauche).
<?php
$Coords_X = $_POST["img_envoi_x"] ;
$Coords_Y = $_POST["img_envoi_y"] ;
echo 'Vous avez cliqué aux coordonnées (' . $Coords_X . ', ' . $Coords_Y . ')' ;
?>
Toutefois, si vous avez attribué un effet de style (CSS) sur la balise Input, et que vous vouliez par exemple la positionner, ou simplement la faire afficher au dessus d'un autre calque vous serez face à un problème sous Firefox. En effet, il ne gère pas bien le positionnement CSS d'un tel élément HTML car il additionne le déplacement par CSS aux coordonnées envoyées (oui, c'est un bug). La solution est de placer l'INPUT dans un DIV et de positionner le DIV au moyen de la CSS.
Exemple :
Style appliqué aux éléments du formulaire

.box {
    height: 609px;
    widht: 632px;
}
.image_envoi {
    position: absolute;
    z-index: 1;
}
.image_envoi2 {
    position: absolute;
    z-index: 2;
}
Définition du fomulaire et ses composants
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <div class="box">
      <div class="image_envoi">
        <input type="image" name="img_envoi" src="image_envoi.png">
      </div>
      <img src="tt" class="image_envoi2">
    </div>
</form>

Comment gérer un formulaire avec deux submit ?
auteur : Forum PHP
Pour savoir quel bouton submit a été cliqué, on effectue un test sur l'attribut name lors de la soumission.

Exemple :
//Définition du form
<form method="post">
    <input type="submit" name="poste" value="Envoyer" />
    <input type="submit" name="previz" value="Prévisualiser" />
</form>
//Test après soumission
if($_POST['poste']) 
{
  echo "submit Envoyer";
}
elseif($_POST['previz'])
{
  echo "submit Prévisualiser";
}

Comment vérifier qu'une chaine comporte uniquement des chiffres et des opérateurs arithmétiques ?
auteur : doof
Une fois de plus, on va faire appel aux expressions régulières et à la fonction preg_match.

if (preg_match('#(^[\d(]+[ +*()/\d-]*[\d)]+$)#', $txt)) {
  // c'est ok
  ...
}
Avec ce masque, il est même possible de remplacer toutes les opérations par leur résultat dans une chaine quelconque :

$txt = '(5 + 2) * 11' ;
$txt=@preg_replace('#([\d(]+[ +*()/\d-]*[\d)]+)#e', "&#39;<b>&#39;.round($0, 3).&#39;</b>&#39;", $txt);
echo $txt; // va afficher 77
Il vaut mieux vérifier avant qu'elle ne renvoie pas d'erreur (ou utiliser l'inhibiteur d'erreur), une parenthèse non fermée ou une division par zéro va entrainer une erreur.


Comment conserver la sélection d'un menu déroulant après une soumission ?
auteur : Thes32
Soit une liste dans un formulaire contenant cinq prénoms. Afin de retenir la sélection de l'internaute, nous allons définir le cible du formulaire comme le script lui même :
<?php 
    $selected = isset( $_GET['prenom'] ) ? $_GET['prenom'] : "" ;
    $selectedValue = 'selected="selected"';
?>
 
<form method="get" >
	<select name="Prend">
		<option value="Jean" <?php if( $selected == "Jean" ) echo $selectedValue ?>>Jean</option>
		<option value="Bob" <?php if( $selected == "Bob" ) echo $selectedValue ?>>Bob</option>
		<option value="Marie" <?php if( $selected == "Marie" ) echo $selectedValue ?>>Marie</option>
		<option value="Charlotte" <?php if( $selected == "Charlotte" ) echo $selectedValue ?>>Charlotte</option>
	</select>
	<br/>
	<input type="submit" value="Envoyer"/>
</form>

Comment extraire les valeurs d'un SELECT multiple ?
auteur : Cyberzoide
Il suffit de déclarer correctement son SELECT en HTML :
<select name="variables[]" multiple="multiple">
<option value="x">xxx</option>
...
</select>
Puis de récupérer le tableau $variable dans le script d'arrivée :
foreach($variables as $variable) {
echo $variable.'<br/>';
}

Comment savoir combien de variables ont été postées ?
auteur : Eric Berger
count($_POST); //avec method="post"
count($_GET); //avec method="get"
ou encore
count($HTTP_POST_VARS); //avec method="post"
count($HTTP_GET_VARS); //avec method="get"

Comment redéfinir comme valeur par défaut d'une liste multiple les choix effectués dans cette liste?
auteur : Jérôme
Il faut bien évidemment que le formulaire et son traitement se trouvent dans le même fichier. Vous devez d'abord récupérer les valeurs de cette liste si le formulaire a déjà été envoyé
<?php
$listemul = $_POST["listemul"] ;
Rappel : comme on utilise une liste multiple, pour pouvoir récupérer toutes les valeurs sélectionnées, il faut en faire un tableau (par conséquent on a récupéré un tableau).

On veut donc ensuite afficher le formulaire avec comme valeurs pré-sélectionnées les choix qui ont été effectués précédemment. On doit donc vérifier pour chaque option de la liste si sa valeur se trouve dans le tableau que l'on a récupéré. Pour cela, on utilise la fonction in_array(arr, cherche[, boolstrict]) qui va vérifier si la valeur cherche se trouve dans le tableau arr. Le paramètre optionnel boolstrict effectue une vérification sur le type de cherche et de la valeur trouvée (inutile ici).

Le code du formulaire:
<form method="post">
    <select name="listemul[]" size="4" multiple>
        <option value="0" <?php if (isset($listemul) && in_array('0', $listemul)) echo "selected";?>>choix 1</option>
        <option value="1" <?php if (isset($listemul) && in_array('1', $listemul)) echo "selected";?>>choix 2</option>
        <option value="2" <?php if (isset($listemul) && in_array('2', $listemul)) echo "selected";?>>choix 3</option>
        <option value="3" <?php if (isset($listemul) && in_array('3', $listemul)) echo "selected";?>>choix 4</option>
    </select>
    <input type="submit">
</form>
On utilise également la fonction isset() pour vérifier que le tableau $listemul existe, dans le cas contraire, la fonction in_array() sur une variable qui n'existe pas provoquerait une erreur.


Comment récupérer les informations d'un champ de type file ?
auteur : Linaa
Il faut utiliser la variable $_FILES qui contient les données du fichier envoyé :
  • $_FILES['nomDuChamp']['name'] : le nom original du fichier
  • # $_FILES['nomDuChamp']['type'] : le type MIME du fichier
  • # $_FILES['nomDuChamp']['tmp_name'] : l'endroit provisoire où se trouve le fichier sur le serveur
  • # $_FILES['nomDuChamp']['error'] : le code d'erreur encontrée (0 = OK)
  • # $_FILES['nomDuChamp']['size'] : la taille du fichier en octets
Note : Ne pas oublier d'ajouter l'attribut enctype dans la balise form.

lien : faq Quels sont les différents paramètres et explications que peut prendre enctype ?
lien : fr Tutoriel : Upload de fichiers en PHP, par Antoine Hérault
lien : fr Les formulaires et PHP - La superglobale $_FILES

Comment empêcher les méfaits du bouton actualiser (renvoi de formulaire) ?
auteurs : Julp, Guillaume Rossolini
Le bouton actualiser du navigateur est souvent "problématique" car à l'issue de l'envoi d'un formulaire il aura pour effet de vous faire parvenir exactement les mêmes données. Vous les reprendriez donc en compte et obtiendriez au final des informations dupliquées. Il est totalement inutile de supprimer, même en partie, le tableau $_POST car s'agissant d'un nouvel appel de votre script (le client émet une nouvelle requête HTTP), ce tableau sera donc recréé. Il existe plusieurs solutions pour s'en prémunir, la plus simple et la plus efficace étant de rediriger le navigateur.

Notes :
  • Cette méthode doit envoyer des entêtes HTTP. Par conséquent, il vous sera impossible d'envoyer un quelconque texte au client ;
  • La solution faisant appel aux cookies, les sessions peuvent être concernées : elles seront sans effet pour un client qui ne gère ou n'accepte pas les cookies.
lien : fr Tutoriel de formulaire réparti sur plusieurs pages, par Guillaume Rossolini


Consultez les autres F.A.Q.


Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2003  Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. 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.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com