0

我有一个存储在变量 $contactid 中的数组。我需要运行此查询为数组中的每个contact_id 插入一行。做这个的最好方式是什么?这是我需要运行的查询...

$contactid=$_POST['contact_id'];
$eventid=$_POST['event_id'];
$groupid=$_POST['group_id'];

mysql_query($query);
$query="INSERT INTO attendance (event_id,contact_id,group_id) VALUES ('$eventid','$contactid','$groupid')";
4

5 回答 5

3

使用foreach循环。

$query = "INSERT INTO attendance (event_id,contact_id,group_id) VALUES ";

foreach($contactid as $value)
{
    $query .= "('{$eventid}','{$value}','{$groupid}'),";
}

mysql_query(substr($query, 0, -1));

这里的想法是连接您的查询字符串并且只对数据库进行 1 次查询,每个值集用逗号分隔

于 2012-11-28T20:57:16.407 回答
2

由于还没有人说,你实际上不能这样做:

$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();
于 2012-11-28T21:05:11.763 回答
1

使用类似下面的东西。请注意,您不应再使用 mysql_* 函数,并且您的代码容易被注入。

for ($i = 0; $i < count($contactid); $i++) {
    $query="INSERT INTO attendance (event_id,contact_id,group_id) VALUES ('$eventid','$contactid[$i]','$groupid')";
    mysql_query($query);
}
于 2012-11-28T20:58:05.547 回答
0

关于什么:

$contactIds = $_POST['contact_id'];
$eventIds = $_POST['event_id'];
$groupIds = $_POST['group_id'];

foreach($contactIds as $key => $value)
{
    $currentContactId = $value;
    $currentEventId = $eventIds[$key];
    $currentGroupId = $groupIds[$key];

    $query="INSERT INTO attendance (event_id,contact_id,group_id) VALUES ('$currentEventId','$currentContactId','$currentGroupId')";

    mysql_query($query);
}

好吧,您可以重构它以在单个查询中插入所有内容,但您明白了。

于 2012-11-28T20:57:50.633 回答
0

我不确定运行多个查询是否是最好的做法,因此不建议创建一个 for 循环,例如,为数组的每个元素运行。我宁愿说,做一个递归循环,将新元素添加到一个字符串中,然后传递给查询。如果您可以给我们一个关于您的数据库结构的简短示例以及您希望它的外观(即数组应该如何进入表中),我可以给您一个示例循环语法。

干杯!

于 2012-11-28T20:56:55.903 回答