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

可変サイズの変数リストを使用したMySQLプリペアドステートメント

    いくつかの解決策を考えることができます。

    1つの解決策は、一時テーブルを作成することです。 in句に含めるパラメータごとにテーブルに挿入します。次に、一時テーブルに対して単純な結合を行います。

    別の方法は、このようなことをすることかもしれません。

    $dbh=new PDO($dbConnect, $dbUser, $dbPass);
    $parms=array(12, 45, 65, 33);
    $parmcount=count($parms);   // = 4
    $inclause=implode(',',array_fill(0,$parmcount,'?')); // = ?,?,?,?
    $sql='SELECT age, name FROM people WHERE id IN (%s)';
    $preparesql=sprintf($sql,$inclause);  // = example statement used in the question
    $st=$dbh->prepare($preparesql);
    $st->execute($parms);
    

    最初の解決策は大きなリストに適している可能性があり、後者は小さなリストに有効であると思われますが、証拠はありません。

    @orrdを幸せにするために、ここに簡潔なバージョンがあります。

    $dbh=new PDO($dbConnect, $dbUser, $dbPass);
    $parms=array(12, 45, 65, 33);
    $st=$dbh->prepare(sprintf('SELECT age, name FROM people WHERE id IN (%s)',
                              implode(',',array_fill(0,count($parms),'?'))));
    $st->execute($parms);
    


    1. データベース内のテーブルごとにSQLiteOpenHelperを継承するクラスを作成する必要がありますか?

    2. INSERT INTO...RETURNING-あいまいな列参照

    3. List<>をSQLストアドプロシージャに渡す

    4. Oracle:範囲を超えてグループ化する方法は?