誰もまだそれを述べていないので、実際にはこれを行うことはできません:
$query = '
INSERT INTO [Table] ([Column List])
VALUES ([Value List 1]);
INSERT INTO [Table] ([Column List])
VALUES ([Value List 2]);
';
mysql_query($query);
これは、mysql_query コードでの sql インジェクションを防ぐために防止されているためです。mysql_query で指定されたクエリ パラメータ内にセミコロンを含めることはできません。次の例外を除いて、マニュアルのコメントから抜粋:
ドキュメントには、「複数のクエリはサポートされていません」と記載されています。
ただし、複数のクエリがサポートされているようです。フラグ 65536 を mysql_connect の 5 パラメーター (client_flags) として渡すだけです。この値は /usr/include/mysql/mysql_com.h で定義されています。
#define CLIENT_MULTI_STATEMENTS (1UL << 16) /* マルチステートメント サポートの有効化/無効化 */
一度に複数のクエリを実行すると、mysql_query 関数は最初のクエリの結果のみを返します。他のクエリも同様に実行されますが、結果は得られません。
ただし、これは文書化されておらず、サポートされていない動作であり、コードを SQL インジェクションに対して簡単に開いてしまいます。代わりに、mysql_query でできることは次のとおりです。
$query = '
INSERT INTO [Table] ([Column List])
VALUES ([Value List 1])
, ([Value List 2])
[...]
, ([Value List N])
';
mysql_query($query);
したがって、実際には、1 つのクエリと 1 つの挿入ステートメントで複数の行を挿入できます。この回答には、ループ内の文字列に連結されないコード例があります。これは、このスレッドで提案されているものよりも優れています。
ただし、上記のすべてを無視して、おそらく次のような準備済みステートメントを使用する方がよいでしょう。
$stmt->prepare("INSERT INTO mytbl (fld1, fld2, fld3, fld4) VALUES(?, ?, ?, ?)");
foreach($myarray as $row)
{
$stmt->bind_param('idsb', $row['fld1'], $row['fld2'], $row['fld3'], $row['fld4']);
$stmt->execute();
}
$stmt->close();