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