ホームページ >バックエンド開発 >PHPチュートリアル >プレースホルダーの配列で 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 サイトの他の関連記事を参照してください。