📘

Les formulaires

Organisations possibles entre fichiers HTML et PHP :

  1. le formulaire dans un fichier HTML et le traitement dans un fichier PHP
  1. le formulaire dans un fichier PHP qui gère l’affichage et le traitement dans un autre fichier PHP
  1. un seul fichier PHP qui gère à la fois l’affichage et le traitement (fonctionnement de Symfony)

Afficher un formulaire


HTML

La balise form est utilisée, avec la propriété action qui appelle le fichier PHP responsable du traitement et la propriété method qui est généralement POST.

Chaque champ de saisie est défini avec la balise input, avec les propriétés type (submit, text, number, email, date…), name et id.

⚠️
En JavaScript, on peut récupérer un input avec son id alors qu’en PHP, on le récupère par son name.

Les champs de saisie sont généralement accompagnés de libellés avec la balise label, avec la propriété for="idChampsConcerne".

Le bouton de validation est déclaré avec un input de type “submit”, avec une propriété supplémentaire value qui affiche un message à l’intérieur du bouton.

<form action="traitement.php" method="POST">
	<label for="prenom">Prénom : </label>
	<input type="text" name="prenom" id="prenom"><br>

	<label for="nom">Nom : </label>
	<input type="text" name="nom" id="nom"><br>

	<input type="submit" name="ok" value="Valider"><br>
</form>
ℹ️
Si le traitement est fait dans le même fichier, on laisse action="".
ℹ️
Si j’ai plusieurs inputs avec le même name, je récupère alors un tableau.

PHP

Au sein d’un fichier PHP, on insère tout le HTML dont on a besoin. On peut boucler sur un tableau de données pour en afficher chaque case, dans une liste déroulante avec la balise select ou des cases à sélectionner avec des inputs de type checkbox ou radio-button.

<body>
<form action="" method="POST">
    <label for="liste">Liste déroulante : </label>
    <select name="liste" id="liste">
        <?php
        $jours = array('lundi','mardi','mercredi','jeudi','vendredi','samedi','dimanche');
        foreach ($jours as $numero=>$jour) {
            echo '<option value="' . $numero . '">' . $jour . '</option>';
        }
        ?>
    </select><br>
    Choix multiple : <br>
        <?php
        $choix = ['choix 1', 'choix 2', 'choix 3'];
        foreach ($choix as $unChoix) {
            echo '<input id="'.$unChoix.'" type="checkbox" name="'.$unChoix.'><label for="'.$unChoix.'">'.$unChoix.'</label><br>';
        }

        ?>
    <input type="submit" name="ok" value="Valider">
</form>

Traiter un formulaire


Variables superglobales

Les variables $_GET, $_POST, $_REQUEST sont disponibles pour récupérer la valeur des inputs sous la forme de tableaux associatifs (clé: name / valeur: saisie).

On teste l’existence de la variable avant de récupérer les valeurs :

if (isset($_GET['prenom']))
	echo'La valeur saisie est '.$_GET['prenom'];
ℹ️
Le tableau est remplacé à chaque submit. Au départ, le tableau est vide (il ne connaît pas les input) puis après le premier submit il les connait, même si les champs sont vides.

Outils : Emmet ul>li*5>lorem+tab permet de rapidement créer la structure avec une ul composée de 5 li, remplis de lorem ipsum.

Validation des données saisies

Il faut purifier les input sinon on se fait hacker…. —> on sanitize toujours.

Plusieurs méthodes sont disponibles : filter_var ou filter_input pour une seule valeur, filter_var_array ou filter_input_array pour plusieurs valeurs

avec chacune des paramètres comme : FILTER_SANITIZE_STRING (pour ne pas interpréter les balises), FILTER_SANITIZE_SPECIAL_CHARS (pour…….), FILTER_VALIDATE_INT (pour spécifier le type à récupérer), FILTER_VALIDATE_EMAIL

Il est possible de créer des filtres de validation personnalisés avec un tableau de filtre et FILTER_VALIDATE_REGEXP.

// Verification que l'utilisateur a clique sur 'OK' et que le nom a ete renseigne
// (sinon un message est affiche), si tout est bon alors il est redirige vers la 
// page prevue

<?php
if (isset($_POST['ok'])) {
	$message = ''; // on initialise un message vide
	$nom = filter_input(INPUT_POST, 'nom', FILTER_SANITIZE_STRING); // on purifie l'input
	if (!$nom) 
		$message .= "Il faut renseigner le nom.";
	if (!$message) {
		// tout est bon, on effectue le traitement 
		header('chemin...');
	}
}
?>
⚠️
En HTML, on utilise required pour rendre des champs de saisie obligatoires : utile pour faire passer des messages à l’utilisateur mais pas pour la sécurité. Il est facile de modifier le code source donc on ne fait jamais confiance à l’utilisateur !!
ℹ️
On utilise souvent la ternaire —> un opérateur fait la même chose (nullish coalescing) : il retourne le côté droit si le côté gauche est nul ou indéfini $var ?? "".