ホームページ > バックエンド開発 > PHPチュートリアル > 配列で PDO の IN 句を正しく使用する方法: 位置プレースホルダーと名前付きプレースホルダー?

配列で PDO の IN 句を正しく使用する方法: 位置プレースホルダーと名前付きプレースホルダー?

DDD
リリース: 2024-12-28 01:37:09
オリジナル
398 人が閲覧しました

How to Correctly Use PDO's IN Clause with Arrays: Positional vs. Named Placeholders?

IN 句配列での PDO の使用

データベース操作に PDO を使用する場合、IN 句で配列を利用することがよくあります。ただし、位置プレースホルダーと名前付きプレースホルダーのアプローチには違いが生じます。

位置プレースホルダー

位置プレースホルダーの場合、次のコード スニペットは正しいアプローチを示しています。

$in_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();
ログイン後にコピー

ただし、名前付きプレースホルダーを使用した次のコードでは、予期しないエラーが発生します。 results:

$in_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([':in_values' => $in_values]);
$my_results = $my_result->fetchAll();
ログイン後にコピー

このコードは、$in_array (1) の最初の要素と等しい my_value を持つ項目のみを返します。

Solution

PDO はこれらのシナリオを異なる方法で処理します。この問題を解決するには、プレースホルダーを含む文字列を動的に作成し、通常どおり配列値をバインドしながらクエリに挿入します。位置プレースホルダーの場合:

$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();
ログイン後にコピー

名前付きプレースホルダーの場合、名前付きプレースホルダーのシーケンスを作成する必要があるため、より複雑なアプローチが必要です。 :id0,:id1,:id2.

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

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

$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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート