PDO を使用すると、値の配列を含む IN 句を含む SQL ステートメントを実行できます。このアプローチは文字列連結 (implode()) ではうまく機能しますが、プレースホルダーを使用する場合に問題が発生する可能性があります。
問題の特定
次のコードでは、プレースホルダーは、期待されるすべての項目を返しません:
$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)); $my_results = $my_result->fetchAll();
このコードは、my_value を持つ項目のみを返します。他の要素 (2 と 3) ではなく、$in_array の最初の要素 (1) と等しくなります。
位置プレースホルダーの解決策
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) を実行し、値をキーと値の配列に収集します。以下に例を示します。
$ids = [1,2,3]; $in = ""; $i = 0; foreach ($ids as $item) { $key = ":id" . $i++; $in .= ($in ? "," : "") . $key; // :id0,:id1,:id2 $in_params[$key] = $item; // collecting values into a key-value array } $sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar"; $stm = $db->prepare($sql); $stm->execute(array_merge(["foo" => "foo", "bar" => "bar"], $in_params)); // merge two arrays $data = $stm->fetchAll();
これらの解決策に従うことで、値の配列を含む IN 句で PDO を正常に使用できます。
以上がPHP で IN 句および配列とともに PDO を正しく使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。