Mysql插入使用数组

时间:2012-11-28 20:51:27

标签: php mysql

我有一个存储在变量$ 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')";

5 个答案:

答案 0 :(得分: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次查询,每个值集用逗号分隔

答案 1 :(得分: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分号。以下例外情况取自manual comments

  

该文档声称“不支持多个查询”。

     

但是,似乎支持多个查询。你必须通过   标志65536作为mysql_connect的5参数(client_flags)。这个值   在/usr/include/mysql/mysql_com.h中定义:

     

#define CLIENT_MULTI_STATEMENTS(1UL<< 16)/ *启用/禁用多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);

因此您实际上可以使用一个查询插入多行,并使用一个insert语句。在this answer中有一个代码示例,它不会连接到循环中的字符串,这比此线程中的建议更好。


然而,无视上述所有情况,你可能还是更好地使用准备好的声明,比如

$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();

答案 2 :(得分: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);
}

答案 3 :(得分:0)

我不确定运行多个查询是最好的事情,因此不建议制作一个for循环,例如,运行数组的每个元素。我宁愿说,做一个递归循环,将新元素添加到字符串,然后传递给查询。如果您可以给我们一个简短的DB结构示例以及您希望它看起来如何(例如数组应该如何进入表格),我可以给您一个示例循环语法。

干杯!

答案 4 :(得分: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);
}

好吧,你可以重构一下,在一个查询中插入所有内容,但你明白了。