ホームページ >バックエンド開発 >PHPチュートリアル >MySQLi プリペアドステートメントを使用して複数の行を効率的に挿入するにはどうすればよいですか?
MySQLi プリペアド ステートメントを使用した複数の行の挿入
問題:
効率的に挿入したいMySQLi の準備されたステートメントを使用してデータベースに複数の行を追加します。現在のアプローチでは、挿入する行ごとに個別の文字列を構築する必要があり、非効率的です。 1 回の実行で複数の行を挿入する単一のプリペアド ステートメントを実行するメソッドを探しています。
解決策:
プリペアド ステートメントは通常、単一行の操作に使用されますが、 1 つのステートメントに複数の行を挿入できる複雑な手法があります。インデックス付き配列のサンプル インデックス付き配列 ([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) でテストされた次のコードは、プロセスを示しています。
このアプローチは、単一の準備済みステートメント (「INSERT INTO test (col1,col2,col3) VALUES (...)」) を構築し、フラット化された $rows 配列からプレースホルダー値を埋めます。 str_repeat 関数は、パラメータをバインドするための適切な数のプレースホルダー文字を定義するために使用されます。<code class="php">$rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; // Sample indexed array of indexed arrays $rowCount = count($rows); $values = "(" . implode('),(', array_fill(0, $rowCount, '?,?,?')) . ")"; $conn = new mysqli("localhost", "root", "", "myDB"); $stmt = $conn->prepare("INSERT INTO test (col1, col2, col3) VALUES $values"); $stmt->bind_param(str_repeat('i', $rowCount * 3), ...array_merge(...$rows)); $stmt->execute();</code>代替アプローチ:
複数の行を挿入するためにループを実行する必要がある場合は、単一行の準備されたステートメントのアプローチ:
<code class="php">foreach ($rows as $row) { $stmt = $conn->prepare("INSERT INTO test (col1, col2, col3) VALUES (?,?,?)"); $stmt->bind_param('iii', $row[0], $row[1], $row[2]); $stmt->execute(); }</code>追加リソース:
[IN() の値の動的な数を使用した SELECT](https:/ /stackoverflow.com/questions/2216867/select-with-dynamic-number-of-values-in-in)
以上がMySQLi プリペアドステートメントを使用して複数の行を効率的に挿入するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。