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 が個別のパラメーターとして扱われることが保証され、クエリを正確に実行できるようになります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3