1

以下のようなコードを使用して、(PDO を使用して) mysql DB に挿入しています。目的は、1 つのクエリのみを使用してデータを挿入することでした。残念ながら、bindValue や param を使用しないため、PDO を使用する目的が無効になります。より安全でありながら不要なクエリを回避するようにコードを記述したいと考えています。誰でもこれを行う方法をお勧めできますか?

注 1:セット内の質問の数は、プログラムにアクセスするたびに変更できます (つまり、$totalQ実行するたびに異なる可能性があります)。

try 
{
    for ($i=0; $i<$totalQ; $i++)
    { 
        $stqid[$i][0]=$lastInsertValue;     //instance         PDO::PARAM_INT
        $stqid[$i][1]=$jqid[$i][0];          //question number  PDO::PARAM_INT
        $stqid[$i][2]=$jqid[$i][5];          //result           PDO::PARAM_INT
        $stqid[$i][3]=$jqid[$i][3];          //question start   PDO::PARAM_STR 
        $stqid[$i][4]=$jqid[$i][4];          //question finish  PDO::PARAM_STR 
    }

    $values = array();
    foreach ($stqid as $rowValues) 
    {
        foreach ($rowValues as $key => $rowValue) 
        {
            $rowValues[$key] = $rowValues[$key];  
        }

        $values[] = "(" . implode(', ', $rowValues) . ")";
    }

    $count = $dbh->exec("INSERT INTO results(instance, qid, result, start, finish) VALUES  ".implode (', ', $values));  
    $dbh = null;
}

注 2:開始と終了の時刻形式にコンマを使用すると、implode ステートメントでエラーが発生する可能性があります。私が達成しようとしていることを見ることができるように、それらを追加しました。

どんな助けでも大歓迎です。ありがとう。

編集:私はクリスの答えを選びましたが、アリックス・アクセルのアドバイスにとても感謝しています。とても助かりました、ありがとう!

4

2 に答える 2

2

未テスト。まだ準備済みステートメントを使用しています。

$numColumns = 5; //or $numColumns = count($stqid[0]);
$rowPlaceholder = join(', ', array_fill(0, $numColumns, '?'));
$rowPlaceholders = array_fill(0, $totalQ, "($rowPlaceholder)");
echo $sql = "INSERT INTO results(instance, qid, result, start, finish) VALUES " . join(", \n", $rowPlaceholders);
$flat = call_user_func_array('array_merge', $stqid);
$stmt = $dbh->prepare($sql);
$stmt->execute($flat);
于 2012-05-10T05:04:01.400 に答える
2

このようなものはどうですか:

try 
{
    for ($i=0; $i<$totalQ; $i++)
    { 
        $stqid[$i][0]=$lastInsertValue;     //instance         PDO::PARAM_INT
        $stqid[$i][1]=$jaid[$i][0];          //question number  PDO::PARAM_INT
        $stqid[$i][2]=$jaid[$i][5];          //result           PDO::PARAM_INT
        $stqid[$i][3]=$jqid[$i][3];          //question start   PDO::PARAM_STR 
        $stqid[$i][4]=$jqid[$i][4];          //question finish  PDO::PARAM_STR 
    }

    $values = null;

    foreach ($stqid as $rowValues) 
    {
        $values .= vsprintf('(%s, %s, %s, %s, %s) ', array_map(array($dbh, 'quote'), $rowValues));
    }

    $count = $dbh->exec('INSERT INTO results (instance, qid, result, start, finish) VALUES ' . rtrim($values) . ';');  
    $dbh = null;
}
于 2012-05-10T04:55:09.377 に答える