ホームページ >データベース >mysql チュートリアル >PDO を使用して単一の MySQL クエリに複数の行を挿入するにはどうすればよいですか?

PDO を使用して単一の MySQL クエリに複数の行を挿入するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-09 00:47:02921ブラウズ

How to Insert Multiple Rows in a Single MySQL Query with PDO?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。