Informatique


Récupérer un formulaire

Sans choix multiple

On propose ici de récupérer un formulaire pour lequel chaque élément n'est affecté que par une seule valeur.

  • le formulaire est envoyé lorsque l'utilisateur clique sur le bouton submit (M'identifier)
  • la variable globale $_POST est générée, il s'agit d'un tableau associatif
  • chaque cellule du tableau $_POST reçoit comme nom associatif les name des éléments du formulaire envoyé
  • à chaque cellule du tableau est associé la valeur choisie par l'utilisateur
  • on récupère le tableau $_POST dans le fichier spécifié derrière l'attribut action
  • pour plus de facilité de manipulation on réaffecte les valeurs contenues dans les cellules de $_POST dans des variables aux noms plus simples
  • on affiche à l'écran les valeurs passées par l'utilisateur avec la pseudo-méthode echo

Démo
<form action="formu_1.php" method="post">
<fieldset>
 <legend>Identification</legend>
	<label for="nom">Nom:</label>
	<input id="nom" type="text" name="nom">
<br>
	<label for="pr">Prénom:</label>
	<input id="pr" type="text" name="pren">
<br>	
	<label for="h">Homme:</label>
	<input id="h" type=radio name =sexe value=M checked>
	<label for="f">Femme:</label>
	<input id="f" type=radio name =sexe value=F>
</fieldset>
<input type="submit" value="M'identifier">
</form>

<?php
	$nom=$_POST['nom'];
	$pren=$_POST['pren'];
	$sexe=$_POST['sexe'];
	echo("Votre nom: ".$nom."Votre prénom: ".$pren." Vous êtes: ".$sexe);
?>

Avec choix multiples

On propose ici de récupérer un formulaire pour lequel chaque élément peut être affecté par plusieurs valeurs.

  • cette fois, pour les centres d'intérêt, on propose de pouvoir cocher plusieurs possibilités
  • afin de pouvoir stocker plusieurs valeurs le name "interet" est déclaré comme étant un tableau au moyen des crochets ouvrant et fermant
  • le tableau $interet est parcouru au moyen d'une boucle for
  • la méthode count() renvoit le nombre de cellules d'un tableau

Démo
<form action="formu_2.php" method="post">
<fieldset>
 <legend>Identification</legend>
	<label for="nom">Nom:</label>
	<input id="nom" type="text" name="nom">
<br>
	<label for="pr">Prénom:</label>
	<input id="pr" type="text" name="pren">
<br>	
	<label for="h">Homme:</label>
	<input id="h" type=radio name =sexe value=M checked>
	<label for="f">Femme:</label>
	<input id="f" type=radio name =sexe value=F>
</fieldset>
<fieldset>
 <legend>Vos activités</legend>
	<label for="mu">Musique</label><input id="mu" type="checkbox" name="interet[]" value="musique">
	<label for="vo">Voyages</label><input id="vo" type="checkbox" name="interet[]" value="voyage">
	<label for="in">Informatique</label><input id="in" type="checkbox" name="interet[]" value="informatique">
	<p>
	<label for="le">Lecture</label><input id="le" type="checkbox" name="interet[]" value="lecture">
	<label for="ci">Cinéma</label><input id="ci" type="checkbox" name="interet[]" value="cinéma">
</fieldset>
<input type="submit" value="M'identifier">
</form>

<?php
$nom=$_POST['nom'];
$pren=$_POST['pren'];
$sexe=$_POST['sexe'];
$interet=$_POST['interet'];
echo("Votre nom: ".$nom.".<br>Votre prénom: ".$pren.".<br>Vous êtes: ".$sexe);
echo(".<br>Vos centres d'intérêt: ");
for($i=0;$i<count($interet);$i++){
	echo($interet[$i].", ");
}
?>

Avec foreach sans choix multiples

Le tableau $_POST est un tableau associatif, on peut dès lors le parcourir avec un foreach.

Ce code permet de créer automatiquement des variables dont les noms sont identiques à ceux des attributs NAME correspondants dans le formulaire HTML. Il fonctionne quelque soit le nombre d'entrées de formulaire.

  • foreach s'arrêtera automatiquement à la fin du tableau $_POST
  • $$key permet de créer les variables, pour rappel on déréférence de l'intérieur vers l'extérieur
  • $key permet de récupérer le nom des variables, $$key permet de créer une variable avec ce nom

Démo
<form action="c_formu_3.php" method="post">
<fieldset>
 <legend>Identification</legend>
	<label for="nom">Nom:</label>
	<input id="nom" type="text" name="nom">
<br>
	<label for="pr">Prénom:</label>
	<input id="pr" type="text" name="pren">
</fieldset>
<input type="hidden" name="test" value="ok">
<input type="submit" value="M'identifier">
</form>
<?
if(isset($_POST['test'])){

foreach($_POST as $key => $val){

        $$key=$val;
		//echo "\$$key=$val";
}
echo "<p>";
echo "La preuve:<br>";
echo "La variable \$nom contient $nom <br>";
echo "La variable \$pren contient $pren <br>";
echo "La variable \$test contient $test <br>";
echo "</p>";
}
?>

Avec foreach avec choix multiples

C'est la même chose sauf qu'on va tester chaque cellule du tableau $_POST pour savoir si elles contiennent éventuellement un tableau.

Démo
<form action="c_formu_4.php" method="post">
<fieldset>
 <legend>Identification</legend>
	<label for="nom">Nom:</label>
	<input id="nom" type="text" name="nom">
<br>
	<label for="pr">Prénom:</label>
	<input id="pr" type="text" name="pren">
<br>
	<label for="pr">Nationalité(s):</label>
	<select name="natio[]" multiple>
		<option value="BE">Belgique</a>
		<option value="EC">Equateur</a>
		<option value="MA">Maroc</a>
		<option value="TR">Turquie</a>
		<option value="UA">Ukraine</a>
	</select>
</fieldset>
<input type="hidden" name="test" value="ok">
<input type="submit" value="M'identifier">
</form>
<?php
if(isset($_POST['test'])){
foreach($_POST as $key => $val){
	if(is_array($val)){
		for($i=0;$i<count($val);$i++){
			echo "\$val[$i]=$val[$i]".", ";
}
	}
	else{
		echo "\$$key=$val ";
	}
}

}

?>


Eviter les notices

Si le fichier contenant le formulaire contient également le script permettant de traiter ce formulaire, alors, à l'ouverture, des notices apparaissent.

Pourquoi?

Car lorsqu'on ouvre le fichier pour la première fois cela veut dire que l'utilisateur n'a pas entré de données.
Dès lors les variables sont vides! Or, en php, une variable n'existe que lorsqu'elle a été affectée.

C'est pourquoi les notice apparaissent!

Pour éviter l'affichage des notices:

  • on utilise un champ hidden pour détecter que l'utilisateur a pressé ou n'a pas pressé le bouton submit
  • si le bouton submit n'a pas été pressé, l'entrée test de $_POST n'a pas été affectée
  • la méthode isset() renvoit true si la variable passée en paramètre a été affectée, false dans le cas contraire
  • si le fichier est ouvert pour la première fois, la condition renvoit false et "Bienvenue sur notre module d'identification"
  • si l'utilisateur a pressé le bouton submit, l'entrée test a été initialisée, la condition renvoit true et le code récupère le formulaire

Démo
<form action="formu_3.php" method="post">
<fieldset>
 <legend>Identification</legend>
	<label for="nom">Nom:</label>
	<input id="nom" type="text" name="nom">
<br>
	<label for="pr">Prénom:</label>
	<input id="pr" type="text" name="pren">
</fieldset>
<input type="hidden" name="test" value="ok">
<input type="submit" value="M'identifier">
</form>

<?php
if(isset($_POST['test'])){
 $nom=$_POST['nom'];
 $pren=$_POST['pren'];
 echo("Votre nom: ".$nom."Votre prénom: ".$pren);
}
else	{
 echo("Bienvenue sur notre module d'identification.");
}
?>