PDO によるデータベース アクセスを強化する取り組みの中で、多くの開発者が、特に「WHERE... IN」に関する課題に直面しています。 IN」のクエリ。複雑な点を詳しく調べて、PDO プリペアド ステートメント内で項目のリストを使用するための適切なアプローチを見つけてみましょう。
次のことが必要なシナリオを考えてみましょう。フォームからチェックされたアイテムのリストに基づいて、データベースからアイテムを削除します。各アイテムには対応する ID があり、通常は配列に格納されます。従来の「WHERE... IN」クエリは次のようになります。
$query = "DELETE FROM `foo` WHERE `id` IN (:idlist)"; $st = $db->prepare($query); $st->execute(array(':idlist' => $idlist));
ただし、このアプローチでは、多くの場合、最初の ID のみが削除されます。これは、PDO がコンマ区切りのリストを単一の値として解釈し、後続の ID を無視するためです。
この問題を回避するには、プレースホルダーを利用してパラメーターをバインドする必要があります。このアプローチには、カンマ区切りのリスト全体を個々のプレースホルダー (疑問符) に置き換え、配列をループして各 ID をプレースホルダーにバインドすることが含まれます。これを実現する方法は次のとおりです。
$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(1, $id); }
この改訂されたアプローチにより、各 ID が個別のパラメーターとして扱われるようになり、クエリを正確に実行できるようになります。
以上がプレースホルダーとパラメーターを使用して「WHERE... IN」を含む PDO クエリを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。