ホームページ >バックエンド開発 >PHPチュートリアル >プレースホルダーの配列で IN 句を使用すると、PDO が予期しない結果を返すのはなぜですか?

プレースホルダーの配列で IN 句を使用すると、PDO が予期しない結果を返すのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-21 08:31:13948ブラウズ

Why Does PDO Return Unexpected Results When Using an IN Clause with an Array of Placeholders?

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(array(':in_values' => $in_values));

答え:

PDO は、値の配列にプレースホルダーを使用する IN 句を処理するのが困難です。この問題を解決するには、プレースホルダーの文字列を動的に作成してクエリに挿入し、配列値を個別にバインドする必要があります。

位置プレースホルダーの場合:

$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);

名前付きプレースホルダーの場合:

// collect parameters for query
$params = ["foo" => "foo", "bar" => "bar"];

// prepare IN clause placeholders and values
$ids = [1,2,3];
$in = "";
$i = 0;
foreach ($ids as $item) {
    $key = ":id" . $i++;
    $in .= ($in ? "," : "") . $key;
    $in_params[$key] = $item;
}

// construct query and execute
$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));

以上がプレースホルダーの配列で IN 句を使用すると、PDO が予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。