ホームページ >バックエンド開発 >PHPチュートリアル >PHP の配列で PDO の IN 句を効果的に使用するにはどうすればよいですか?
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 サイトの他の関連記事を参照してください。