MySQL IN ステートメントの PDO バインディング値
質問:
どうすれば、 PDO を使用して値の配列を MySQL IN ステートメントに送信し、その際、内部の個々の値を維持します。ステートメント?
答え:
PDO を使用して MySQL で値の配列を IN ステートメントにバインドすると、PDO が値をエスケープする方法が原因で問題が発生します。デフォルトでは、PDO は文字列値を一重引用符でエスケープします。これにより、配列全体が個々の要素ではなく、IN 句内の単一の文字列として扱われるようになります。
残念ながら、PDO でこれを直接実現する簡単な方法はありません。ただし、別のアプローチもあります。
1.クエリを手動で構築する
参照された質問で提案されているように、IN 句内の値を連結することでクエリを手動で構築できます。
$sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (" . implode(',', $values) . ")";
2. FIND_IN_SET の使用
FIND_IN_SET は、カンマ区切りリスト内の部分文字列を検索できる MySQL 関数です。このアプローチには、FIND_IN_SET への引数として引用符で囲まれたカンマ区切りのリストを使用することが含まれます:
$sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE FIND_IN_SET(CAST(products.id AS CHAR), :products)";
ただし、FIND_IN_SET は大規模なデータセットのパフォーマンスに影響を与える可能性があります。
3.ユーザー定義関数 (UDF) の作成
UDF を MySQL で作成して、カスタム操作を実行できます。カンマ区切りのリストを個々の値に分割する UDF を作成できます。この方法は、大きな IN 句を含むクエリにとって最も効率的なオプションと考えられています。
これらのアプローチのいずれかを採用することで、ステートメント内の個々の値を維持しながら、値の配列を MySQL IN ステートメントに効果的にバインドできます。
以上がPDO を使用して配列を MySQL IN ステートメントに安全にバインドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。