ホームページ > バックエンド開発 > PHPチュートリアル > PDO の IN 句が配列パラメータで機能しないのはなぜですか?それを修正するにはどうすればよいですか?

PDO の IN 句が配列パラメータで機能しないのはなぜですか?それを修正するにはどうすればよいですか?

DDD
リリース: 2024-12-26 14:17:09
オリジナル
788 人が閲覧しました

Why Doesn't PDO's IN Clause Work with Array Parameters, and How Can I Fix It?

IN 句配列で PDO を使用する

PDO を使用して、値に配列を使用する IN 句を含むステートメントを実行する場合、予期しない動作が発生する可能性があります。この記事では、特定のアプローチが機能しない理由を説明し、代替ソリューションを提供します。

例:

$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN ($in_values)");
$my_result->execute();
$my_results = $my_result->fetchAll();
ログイン後にコピー

このコードは期待どおりに機能します。ただし、IN 句で名前付きパラメータを使用しようとすると、次のコードは使用できません。

$in_array = array(1, 2, 3);
$in_values = implode(',', $in_array);
$my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)");
$my_result->execute(array(':in_values' => $in_values));
$my_results = $my_result->fetchAll();
ログイン後にコピー

説明:

PDO は、次の IN 句を処理するのが困難です。配列。代わりに、プレースホルダーを含む文字列を作成し、それをクエリに挿入し、通常の方法で配列値をバインドする必要があります。

代替案:

位置指定の使用プレースホルダー

プレースホルダーを含む文字列を動的に作成し、 query:

$in  = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();
ログイン後にコピー

名前付きプレースホルダーの使用

array_merge() 関数を使用すると、名前付きプレースホルダーを含むすべての変数を単一の配列に結合できます:

// Other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

$ids = [1, 2, 3];
$in = "";
$i = 0; // Using an external counter because actual array keys could be dangerous
foreach ($ids as $item) {
    $key = ":id" . $i++;
    $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2
    $in_params[$key] = $item; // Collecting values into a key-value array
}

$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params, $in_params)); // Just merge two arrays
$data = $stm->fetchAll();
ログイン後にコピー

以上がPDO の IN 句が配列パラメータで機能しないのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート