0

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

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

html页面

<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()) 以便插入的东西,还是有替代方法?

感谢您的任何建议。

4

5 回答 5

1

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

$sql ="insert into table (var, timeentered) values ";
$sql .= "(".implode(", now()), (", $vars).")";
于 2013-01-31T00:26:18.267 回答
0

我能想到的两个选择。

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

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

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

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

于 2013-01-31T00:24:23.047 回答
0

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

问题可能涉及您要插入多少项目之一。如果您一次只插入几条记录,那么您可能需要考虑只使用准备好的语句和单独的插入。但是,如果您要一次插入数百条记录,那可能不是一个好主意。

于 2013-01-31T00:27:12.753 回答
0

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

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

于 2013-01-31T00:28:22.283 回答
0

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

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

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

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

那么您可以使用双引号在查询中使用 $values 。

于 2013-01-31T00:58:04.920 回答