sql >> データベース >  >> RDS >> Mysql

PHP-IN句配列でのPDOの使用

    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();
    

    クエリに他のプレースホルダーがある場合は、次のアプローチを使用できます(コードは私のPDOチュートリアルから取得されます ):

    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 。したがって、コードは次のようになります。

    // other parameters that are going into query
    $params = ["foo" => "foo", "bar" => "bar"];
    
    $ids = [1,2,3];
    $in = "";
    $i = 0; // we are using an external counter 
            // because the actual array keys could be dangerous
    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($params,$in_params)); // just merge two arrays
    $data = $stm->fetchAll();
    

    幸い、名前付きプレースホルダーの場合、厳密な順序に従う必要がないため、配列を任意の順序でマージできます。



    1. 外部キーSQL:外部キー操作について知っておくべきことすべて

    2. postgresql関数を使用して異なるテーブル名からデータをフェッチしたい

    3. SQLiteで先行ゼロを使用して数値をフォーマットする方法

    4. MariaDBの日付と時刻の関数に使用される言語を設定します