複数のバインディング用のパラメーターの結合
データベース クエリでは、SQL インジェクションを防止してパフォーマンスを向上させるために、バインドされたパラメーターを持つ準備されたステートメントを使用するのが一般的です。ただし、ステートメント内で同じパラメータを複数回使用する必要がある場合、課題が発生します。
課題: パラメータを複数回バインドする
データベース用の人気のある PHP 拡張機能である PDOインタラクションにより、準備されたステートメント内でのパラメーター マーカーの再利用が制限されます。この制限により、クエリで同じパラメータが複数回必要になる場合に問題が発生します。
解決策
この状況に対処するには、いくつかの方法があります。
1.ユーザー定義変数 (MySQL)
このソリューションには、MySQL ユーザー定義変数の作成とそれに共通のパラメーター値の保存が含まれます。その後、変数は "@term" を使用してクエリ内で繰り返し参照できます。
SET @term = :term; SELECT ... FROM table WHERE name LIKE @term OR number LIKE @term;
2.パラメータを配列にバインド
PDO ではパラメータ マーカーの再利用は禁止されていますが、値の配列を単一のパラメータにバインドすることは可能です。この方法では、単一のパラメーターではなく配列を受け入れるようにクエリを変更する必要があります。
SELECT ... FROM table WHERE name IN (:term) OR number IN (:term); $term = ["hello", "world"]; $stmt->bindParam(":term", $term, PDO::PARAM_STR | PDO::PARAM_ARRAY);
3.動的クエリ生成
もう 1 つのオプションは、パラメータ マーカーを一意のサフィックスと連結してクエリ文字列を動的に生成し、複数の一意のパラメータを効果的に作成することです。この方法では、サーバー側でもう少し処理が必要です。
$query = "SELECT ... FROM table WHERE name LIKE :term1 OR number LIKE :term2"; $pdo->prepare($query); $pdo->bindValue(":term1", "%$term%", PDO::PARAM_STR); $pdo->bindValue(":term2", "%$term%", PDO::PARAM_STR);
結論
PDO プリペアド ステートメントで複数の同一パラメータを扱う場合、開発者は次のいずれかを選択できます。特定の要件に基づいたさまざまなソリューション。 MySQL のユーザー定義変数はシンプルでセッションセーフなアプローチを提供しますが、パラメーターを配列にバインドしたり、動的クエリを生成したりすると、さまざまなパフォーマンスのトレードオフを持つ代替オプションが提供されます。
以上がPDO プリペアド ステートメントで同じパラメータの複数のインスタンスを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。