Soutenez-nous

FAQ PHPConsultez toutes les FAQ

Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 29 juillet 2013 

 
OuvrirSommaireConcepts fréquentsFormulaires

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.

Mis à jour le 3 août 2008  par 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.
 
Sélectionnez
if(strlen($chaine) < 1){
    echo "la chaîne est vide";
} else {
    echo "la chaîne n'est pas vide";
}
Mis à jour le 3 août 2008  par Eric Berger

Lien : Comment se protéger de la faille XSS ?
Lien : Comment se protéger des failles d'injection ?

Soit le champ de formulaire de méthode POST suivant :

 
Sélectionnez
<input type="text" name="mon_champ" ...>

Tester si $_POST["mon_champ"] est un entier :

 
Sélectionnez
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 :

 
Sélectionnez
if(is_numeric($_POST['mon_champ'])) {
    echo 'Saisie correcte !';
} else {
    echo 'Saisie incorrecte !';
}

Tester si $_POST["mon_champ"] est une adresse email valide :

 
Sélectionnez
if (ereg('^.+@.+\\..+$', $_POST['mon_champ'])) {
    echo 'Email valide !';
} else {
    echo 'Email invalide !';
}
Mis à jour le 3 août 2008  par Julp

La syntaxe d'un champ input de type text est la suivante :

 
Sélectionnez
<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 :
Sélectionnez
<input type="text" name="nom" value="<?php echo $nom; ?>" />
Exemple inexact :
Sélectionnez
<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 :
Sélectionnez
<input type="text" name="nom" value="<?php echo htmlentities($nom); ?>" />
Mis à jour le 3 août 2008  par Cyberzoide

Lien : Comment se protéger de la faille XSS ?

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 :

 
Sélectionnez
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.

 
Sélectionnez
$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;
Mis à jour le 3 août 2008  par f-demu01

Lien : Les formulaires et PHP5, par Guillaume Rossolini
Lien : Comment se protéger de la faille XSS ?
Lien : Comment se protéger des failles d'injection ?

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
Sélectionnez

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

Mis à jour le 3 août 2008  par Forum PHP

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

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.

 
Sélectionnez
<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).

 
Sélectionnez
<?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
Sélectionnez

.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
Sélectionnez
<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>
Mis à jour le 3 août 2008  par Jérôme

Pour savoir quel bouton submit a été cliqué, on effectue un test sur l'attribut name lors de la soumission.

Exemple :

 
Sélectionnez
//Définition du form
<form method="post">
    <input type="submit" name="poste" value="Envoyer" />
    <input type="submit" name="previz" value="Prévisualiser" />
</form>
 
Sélectionnez
//Test après soumission
if($_POST['poste']) 
{
  echo "submit Envoyer";
}
elseif($_POST['previz'])
{
  echo "submit Prévisualiser";
}
Créé le 26 juin 2006  par Forum PHP

Une fois de plus, on va faire appel aux expressions régulières et à la fonction preg_match.

 
Sélectionnez

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 :

 
Sélectionnez

$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.

Mis à jour le 3 août 2008  par doof

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 :

 
Sélectionnez
<?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>
Mis à jour le 8 mars 2011  par Thes32

Il suffit de déclarer correctement son SELECT en HTML :

 
Sélectionnez
<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 :

 
Sélectionnez
foreach($variables as $variable) {
echo $variable.'<br/>';
}
Mis à jour le 3 août 2008  par Cyberzoide
 
Sélectionnez
count($_POST); //avec method="post"
count($_GET); //avec method="get"

ou encore

 
Sélectionnez
count($HTTP_POST_VARS); //avec method="post"
count($HTTP_GET_VARS); //avec method="get"
Mis à jour le 3 août 2008  par Eric Berger

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é

 
Sélectionnez
<?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:

 
Sélectionnez
<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.

Mis à jour le 3 août 2008  par Jérôme
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.

Créé le 7 novembre 2007  par Linaa

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

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.
Mis à jour le 3 août 2008  par Julp, Guillaume Rossolini

Lien : Tutoriel de formulaire réparti sur plusieurs pages, par Guillaume Rossolini

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Developpez.com 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.