ホームページ >データベース >mysql チュートリアル >PDO を使用して単一の MySQL クエリに複数の行を挿入するにはどうすればよいですか?
PDO MySQL: 1 つのクエリに複数の行を挿入
PDO を使用して 1 つのクエリに複数の行を挿入するのは、困難な作業になる場合があります。ただし、プリペアド ステートメントの機能を利用することで、このプロセスを簡素化し、一般的なエラーを回避できます。
問題: 配列から文字列への変換
「複数の行を含む INSERT クエリを実行しようとすると「配列から文字列への変換」エラーが発生する場合は、PDO ステートメントが代わりに配列をプレースホルダーにバインドしようとしている可能性があります。
解決策: 個別の値をバインドする
この問題を解決するには、各行の値を反復処理し、プリペアド ステートメントに個別にバインドする必要があります。これは、PDO ステートメント オブジェクトの bindingParam() メソッドを使用して実現できます。
たとえば、次のコードを考えてみます。
$query = "INSERT INTO $table (key1, key2, key3) VALUES (:key1, :key2, :key3)"; $stmt = $pdo->prepare($query); foreach ($data as $item) { $stmt->bindParam(':key1', $item['key1']); $stmt->bindParam(':key2', $item['key2']); $stmt->bindParam(':key3', $item['key3']); $stmt->execute(); }
このコードは、$data 配列の各値をバインドします。準備されたステートメント内の対応するプレースホルダーを使用して、配列内の各行に対して 1 回ずつクエリを複数回実行します。
代替解決策:配列バインディングを使用する
または、一部の PDO ドライバーは配列バインディングをサポートしており、値の配列全体を 1 つのプレースホルダーにバインドできます。ただし、この機能は広くサポートされているわけではなく、すべてのケースで利用できるわけではありません。
改良されたコード例
ここでは、multipleInsert() 関数の改良版を示します。準備されたステートメントを使用し、値を個別にバインドします:
public function multipleInsert($table, $data = array()) { if (count($data) > 1) { $fieldnames = array_keys($data[0]); $query = "INSERT INTO $table (`" . implode('`, `', $fieldnames) . "`) VALUES "; $query .= implode(', ', array_fill(0, count($data), "(:" . implode(', :', $fieldnames) . ")")); $stmt = $this->start->prepare($query); $i = 1; foreach ($data as $item) { foreach ($item as $key => $value) { $stmt->bindParam(":$key$i", $item[$key]); $i++; } } $stmt->execute(); $return['status'] = true; $return['lastid'] = $this->start->lastInsertId(); return $return; } else { die('$data is less than two arrays, use single insert instead.'); } }
以上がPDO を使用して単一の MySQL クエリに複数の行を挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。