ホームページ > バックエンド開発 > PHPチュートリアル > PHP の配列で PDO の IN 句を効果的に使用するにはどうすればよいですか?

PHP の配列で PDO の IN 句を効果的に使用するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-19 19:45:19
オリジナル
379 人が閲覧しました

How Can I Effectively Use PDO's IN Clause with Arrays in PHP?

PHP - 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 (?)");
$my_result->execute([$in_values]);
$my_results = $my_result->fetchAll();
ログイン後にコピー
ただし、次のコードは予期しない結果を示します動作:

$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();
ログイン後にコピー
このコードは、my_value が $in_array の値と一致するすべての項目を返すのではなく、my_value が $in_array の最初の項目と一致する項目のみを返します。

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);
$data = $stm->fetchAll();
ログイン後にコピー
複数のプレースホルダーがある場合は、array_merge() の利用を検討してください。例:

$arr = [1, 2, 3];
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();
ログイン後にコピー
名前付きプレースホルダーを使用するシナリオでは、:id0、:id1、:id2 などの一連のプレースホルダーの生成が含まれるため、プロセスはより複雑になります。

$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 id IN ($in)";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params, $in_params));
$data = $stm->fetchAll();
ログイン後にコピー
幸いなことに、名前付きプレースホルダーは厳密な順序を必要とせず、任意の配列をマージできます。シーケンス。

以上がPHP の配列で PDO の IN 句を効果的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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