【问题标题】:Inserting multiple rows from php foreach从php foreach插入多行
【发布时间】:2014-02-28 18:27:17
【问题描述】:

我有一个带有动态(用户确定)行数的 html 表单,每行都有几个输入;我正在尝试实现将插入行的 MySQL 查询 到 db 表中,或多或少是逐行的(尽管在这个表之外有一个值 $_POSTing,我也会添加到 INSERT 中)。

我正在像这样检索这些值:

<?php
    if (isset($_POST['submit'])) {

        $lineItems = array();
        foreach ($_POST['date'] as $i => $value) {
            $customer = $_POST['customer'][$i]; // this value is from *outside* the line items table
            $date = $_POST['date'][$i];
            $time = $_POST['time'][$i];
            $fee = $_POST['fee'][$i];

            $lineItems[] = "('$customer', '$date', '$time', '$fee')";

        // I realize the query should be outside the loop, but what I'm trying to do is something like this (pseudo-code):
            $query = "INSERT INTO Line_Items (CUSTOMER, DATE, TIME, FEE) VALUES ". implode(", ", $lineItems)
            . "ON DUPLICATE KEY UPDATE
            CUSTOMER    = VALUES(CUSTOMER),
            DATE        = VALUES(DATE),
            TIME        = VALUES(TIME),
            FEE     = VALUES(FEE)
            ";

        }
    }
?>

使用此查询 - 在循环内部或外部 - 我只插入来自最后一行输入的值;有人可以举例说明如何 构造一个查询以插入多个行项目和适当的查询?非常感谢。

【问题讨论】:

  • 拜托,在您编写 任何 更多 SQL 接口代码之前,您必须阅读 proper SQL escaping 以避免像您在这里遇到的那样严重的 SQL injection bugs从不$_POST数据直接放入查询中。
  • 如果将插入语句放在循环之外似乎可以正常工作...
  • 谢谢@tadman。我只是想解决这个问题,我向你保证我会重新审视注射预防。
  • 您应该在忘记之前解决这个问题,因为当您忘记terrible things can happen。如果您使用的是 PDO 等数据库层,请使用 占位符值。字符串插值是一个非常糟糕的主意。

标签: php mysql


【解决方案1】:

在循环内,您将在帖子中的每一行得到一行 - 在循环外,您将只插入最后一行。

如果您只需要最后一行 - 则无需遍历整个集合即可找到它。

您可以计算行数 - 然后直接定位最后一行 - 参见 php

count() 

【讨论】:

  • 谢谢。我当然想要所有行,而不仅仅是最后一行。
  • 谢谢。我当然想要所有的行,而不仅仅是最后一个。修改后的查询仍在循环内,我收到一个 mysql 错误,可能与 ON DUPLICATE KEY 部分有关。扯掉我的头发
【解决方案2】:

将线路
$lineItems[] = "('$customer', '$date', '$time', '$fee')"; 改为
$lineItems[] = "(".$customer.",".$date.",".$time.",".$fee.")";

【讨论】:

  • 谢谢@user2340218。现在,使用这个: $lineItems[] = "(".$customer.",".$date.",".$time.",".$fee.")"; $queryx = “插入 Invoice_Hours(客户、日期、时间、费用)值”。内爆(“,”,$lineItems)。 “在重复键更新客户 = 值(客户),日期 = 值(日期),时间 = 值(时间),费用 = 值(费用)”;我收到一个 mysql 错误,回复:ON DUPLICATE。有什么建议吗?
  • “Line_items”表中的唯一键是什么?如果“customer”是唯一键或主键,请使用以下内容:“INSERT INTO Line_Items (CUSTOMER, DATE, TIME, FEE) VALUES”。内爆(“,”,$lineItems)。 “在重复键更新日期 = 值(日期),时间 = 值(时间),费用 = 值(费用);”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2010-12-21
  • 2012-05-23
  • 2017-07-08
  • 1970-01-01
相关资源
最近更新 更多