Requêtes PDO avec clauses "WHERE... IN"
Lorsque vous travaillez avec le PDO de PHP pour l'accès à la base de données, la construction de "WHERE... Les requêtes IN" peuvent être difficiles. Dans ce cas, l'objectif est de supprimer des enregistrements d'une table en fonction d'une liste d'identifiants obtenus à partir d'un formulaire.
Requête originale
<code class="php">$query = "DELETE from `foo` WHERE `id` IN (:idlist)"; $st = $db->prepare($query); $st->execute(array(':idlist' => $idlist));</code>
Problème
Cette requête supprime uniquement le premier identifiant de la liste, ignorant les identifiants restants en raison du séparateur par virgule.
Solution utilisant des points d'interrogation
Étant donné que les instructions préparées ne peuvent pas mélanger les valeurs avec la logique du flux de contrôle (les virgules), il est nécessaire d'utiliser un espace réservé par valeur dans la liste. Ceci est réalisé en créant une chaîne de points d'interrogation séparés par des virgules et en leur liant les identifiants individuels.
<code class="php">$idlist = array('260','201','221','216','217','169','210','212','213'); $questionmarks = str_repeat("?,", count($idlist)-1) . "?"; $stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` IN ($questionmarks)"); foreach ($idlist as $id) { $stmt->bindParam($id); }</code>
Cette approche nécessite de parcourir la liste pour lier chaque identifiant de manière séquentielle, garantissant que tous les enregistrements sont supprimés comme prévu.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!