由于还没有人说,你实际上不能这样做:
$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) /* 启用/禁用 multi-stmt 支持 */
一次执行多个查询,mysql_query 函数将只返回第一个查询的结果。其他查询也将被执行,但您不会得到它们的结果。
但是,这是未记录且不受支持的行为,并且很容易将您的代码打开到 SQL 注入。相反,你可以用 mysql_query 做的是
$query = '
INSERT INTO [Table] ([Column List])
VALUES ([Value List 1])
, ([Value List 2])
[...]
, ([Value List N])
';
mysql_query($query);
因此,您实际上可以使用一个查询和一个插入语句插入多行。在这个答案中有一个代码示例,它不会连接到循环中的字符串,这比这个线程中建议的要好。
但是,无视上述所有内容,您最好还是使用准备好的语句,例如
$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();