mysql php使用逗号分隔值插入多行

时间:2013-01-31 00:18:36

标签: php mysql insert

我有一个html页面,我从复选框中收集一组值以插入数据库。 html页面发布到PHP页面,该页面收集数据然后存储在数据库中。

对于每个值,我想要包含的其他几个字段对于所有值(例如输入的时间)都是相同的。我可以使用implode轻松地将捕获的数组转换为逗号分隔列表。我使用这样的逗号分隔的id列表来更新和删除记录。但是,当我想插入它们时,MYSQL似乎不允许您使用逗号分隔列表。我的问题是,插入记录的最简单方法是什么,一个用于c逗号分隔列表中的每个值,而不使用循环。

html page

<input type="checkbox" name="var[]" value=1>
<input type="checkbox" name="var{}" value=2>

PHP页面

$vars = $_POST['var'];

这给了我一个数组,我可以使用implode转换为逗号分隔的列表。

要删除,我可以去

$sql = "DELETE * from table WHERE id in '$vars'";

要更新,我可以去

$sql = "UPDATE table, WHERE id in '$vars'";

但似乎没有相应的插入。

以下工作:

$sql = "INSERT into table (var, timeentered) values (1,now()) (2,now())";

但是,这不是我的数据。我想做的是像

$sql = "INSERT into table (var,timeentered) values($vars), now()"但当然不起作用。

我是否必须将用于更新和删除效果良好的逗号分隔列表转换为类似于(1,now)(2,now())的内容,以便插入或是否有其他选择?

感谢您的任何建议。

5 个答案:

答案 0 :(得分:1)

不幸的是,您必须自己构建整个查询:

$sql ="insert into table (var, timeentered) values ";
$sql .= "(".implode(", now()), (", $vars).")";

答案 1 :(得分:0)

我能想到的两个选择。

按照您的建议构建动态插入查询。但是,不要每次调用now(),而只是插入一个日期,即

$time = gmdate();
$sql = "INSERT into table (var, timeentered) values (1,$time) (2,$time)";

或者使用下面单个插入的预准备语句,关闭自动提交,启动事务并在for循环中执行准备好的语句以获取所需的插入次数,然后提交事务。

$sql = "INSERT into table (var, timeentered) values (?,?)"

答案 2 :(得分:0)

您需要遍历数据集并手动创建多行插入查询。如果要使用单个查询插入多个行,则没有其他选择。这不是使用某些DB框架,这可能会为这样做提供更好的界面。当然,在一天结束时,这样的数据库框架本质上是在某些时候手动构建多项插入查询。

可能会对要插入的项目之一进行处理。如果您一次只要插入一些记录,那么您可能需要考虑使用带有单个插入的预准备语句。但是,如果您要一次插入数百条记录,那可能不是一个好主意。

答案 3 :(得分:0)

在mysql数据库中,您可以将“time_created”列的默认值设置为TIMESTAMP默认CURRENT_TIMESTAMP。这样你就不用担心了。只需使用常规插入,它将自动设置“time_created”列。

对于您的其他多行插入问题,您可以创建$ update数组并使用foreach循环在每行数据上发出sql insert命令。

答案 4 :(得分:0)

大多数情况下,您必须使用某种类型的循环结构来构建查询。如果您只是想知道如何使多个插入语句使您的数组可接受,那么除了惯例和最佳实践之外,为什么不这样做:

$values = '('.implode('),(', $array).')';

或者如果已经是CSV,那么:

$values = '('.implode('),(', explode(',' $csv)).')';

然后你可以使用双引号在查询中使用$ value。