【问题标题】:mysql php insert multiple rows with comma delimited valuesmysql php用逗号分隔值插入多行
【发布时间】:2013-01-14 23:57:39
【问题描述】:

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

感谢您的任何建议。

【问题讨论】:

  • @Lucas 这绝对不正确。

标签: php mysql insert


【解决方案1】:

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

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

【讨论】:

  • 所以 implode("now(),.",".$vars.") 在 var 中的每个元素之后插入一个 now?这看起来是一种优雅的方式。但是,这似乎不像普通的内爆语法,还是我遗漏了什么?
  • 这是一种普通的内爆语法,但为了附加开始“(”和结束“)”符号,您需要手动连接它。
  • 不会在数组值之间插入分隔符,但不是在末尾?所以我必须手动附加最终分隔符(在这种情况下是额外的 ,now()
  • 我的错,当然应该是 ", now())" 连接在 ")" 的末尾:)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我能想到的两个选项。

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

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

      或者使用下面单个insert的prepared statement,关闭autocommit,启动一个事务,在for循环中执行prepared statement,获取需要的insert次数,然后提交事务。

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

      【讨论】:

        【解决方案5】:

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

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

        或者如果已经是 CSV 则:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          • 2016-01-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多