1. ホーム
  2. php

[解決済み] PDO Preparedが1つのクエリで複数行を挿入する

2022-04-25 20:34:04

質問

現在、MySQLでこのタイプのSQLを使用して、1つのクエリで複数行の値を挿入しています。

INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),...

PDOに関する読み物では、プリペアドステートメントを使用することで、スタティッククエリよりもセキュリティが高くなるはずです。

そこで、プリペアドステートメントを使用して、1つのクエリで複数行の値を挿入することが可能かどうかを知りたいのです。

もしそうなら、どのように実装すればよいか教えてください。

どのように解決するのですか?

PDOのプリペアドステートメントで複数値のインサート

1つのexecute文で複数の値を挿入する。なぜかというと、以下によると このページ は、通常の挿入よりも高速になります。

$datafields = array('fielda', 'fieldb', ... );

$data[] = array('fielda' => 'value', 'fieldb' => 'value' ....);
$data[] = array('fielda' => 'value', 'fieldb' => 'value' ....);

または、データを入力するループがあるはずです。

プリペアドインサートでは、挿入先のフィールドと、パラメータをバインドするためのプレースホルダを作成するためのフィールド数を知っておく必要があります。

insert into table (fielda, fieldb, ... ) values (?,?...), (?,?...)....

基本的にinsert文はこのような形にしたいのです。

さて、コードです。

function placeholders($text, $count=0, $separator=","){
    $result = array();
    if($count > 0){
        for($x=0; $x<$count; $x++){
            $result[] = $text;
        }
    }

    return implode($separator, $result);
}

$pdo->beginTransaction(); // also helps speed up your inserts.
$insert_values = array();
foreach($data as $d){
    $question_marks[] = '('  . placeholders('?', sizeof($d)) . ')';
    $insert_values = array_merge($insert_values, array_values($d));
}

$sql = "INSERT INTO table (" . implode(",", $datafields ) . ") VALUES " .
       implode(',', $question_marks);

$stmt = $pdo->prepare ($sql);
$stmt->execute($insert_values);
$pdo->commit();

私のテストでは、マルチプルインサートを使用した場合と、単一の値を持つ通常のプリペアドインサートを使用した場合の差は1秒しかありませんでしたが。