Formation PUB010 : PHP, 2025 Les listes déroulantes

46.2 Valider la clé étrangère saisie dans un formulaire avec PHP


Quand une table contient une clé étrangère, un formulaire qui sert à ajouter un enregistrement dans cette table devra permettre de saisir facilement la valeur de la clé étrangère.

Prenons l'exemple d'un formulaire qui permet d'ajouter un item. La catégorie de cette item est une clé étrangère. Sa valeur sera tirée de la table categories.

Dans le formulaire HTML, la catégorie peut être présentée de différentes façons, par exemple sous la forme de balise <select> ou de boutons radio.

Liste déroulante Boutons radio

Pour chaque catégorie disponible, l'attribut value de la balise <option> ou du bouton radio correspondra à l'identifiant de l'enregistrement dans la table categories.  

Génération du formulaire (PHP)

$i = 0;
while ($i < count($idCategories)) {
    echo "<option value='$idCategories[$i]'>$texteCategories[$i]</option>";
    $i++;
}

Peu importe comment la catégorie a été saisie, il faudra s'assurer que cette valeur est valable, c'est-à-dire qu'il y a effectivement un enregistrement avec cet identifiant dans la table categories.

Risque si on ne s'assure pas que la valeur est valable

Mais pourquoi faire cette validation puisque les valeurs viennent d'être générées à partir de la base de données? C'est qu'un usager malveillant pourrait trafiquer les valeurs, histoire de voir si le programme réagit correctement.

Et ceci est très facile à réaliser.

Alors que le formulaire est affiché dans le navigateur, faites un clic droit sur la liste déroulante ou sur un bouton radio puis choisissez Inspecter.

Double-cliquez sur un attribut value puis entrez-y une valeur que vous croyez qui n'existe pas.

Et voilà, pas plus compliqué que ça!

Changer la valeur d'une option

Il est vrai qu'avec une contrainte d'intégrité référencielle, l'enregistrement ne pourra pas avoir lieu si la valeur de la clé étrangère n'est pas valable. Par contre, si la contrainte d'intégrité référentielle n'était pas en place, il faut empêcher l'enregistrement d'une catégorie non valable.

Vérifier si la valeur est valable

Avant d'utiliser la valeur sélectionnée pour la clé étrangère, une requête SQL permettra de s'assurer qu'elle correspond à un enregistrement dans la table concernée.

Dans notre exemple, on doit vérifier si la catégorie sélectionnée existe dans la table categories.

Ce code est conçu pour un programme PHP vanille. Si vou travaillez avec un autre environnement, par exemple WordPress, vous devrez bien entendu l'ajuster pour utiliser $wpdb plutôt que $mysqli.

Traitement du formulaire (PHP 8.x)

$requete = "SELECT id FROM categories WHERE id=?";

try {
    $stmt = $mysqli->prepare($requete);
    $stmt->bind_param('i', $categorie_id);
    $stmt->execute();
    $stmt->store_result();

    if (0 == $stmt->errno) {
        if (0 == $stmt->num_rows) {
            $messageErreur = 'La catégorie choisie n\'est pas valable.';
        }
    } else {
        $messageErreur = 'Il n\'est pas possible de valider la catégorie (code 1).';
        log_debug($stmt->error);
    }

    $stmt->close();
} catch (Exception $e) {
    $messageErreur = 'Il n\'est pas possible de valider la catégorie (code 2).';
    log_debug($mysqli->error);
}

▼Publicité

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre