【问题标题】:Insert, update or delete in multiple row form以多行形式插入、更新或删除
【发布时间】:2015-05-12 17:03:59
【问题描述】:

如果我在发票表单中对产品进行了一些更改,例如编辑一个、删除其他产品或通过一个查询添加新产品,我需要知道如何在多行中创建 INSERTUPDATEDELETE ...我尝试了更新,但是如果我删除一两个产品,或者如果我添加一两个并保存表单,则在 DB 中不会进行更改,只有以前在 DB 中的数据已更新。

这是我的代码:

            if (!empty($_POST)) {
                $conn->beginTransaction();
                $stmt = $conn->prepare("UPDATE PRODUCTOS SET `cod` = :cod, `nombreProd` = :nombreProd, `proveedor` = :proveedor, `existencia` = :existencia, `ref_compra` = :ref_compra 
                WHERE `id_p` = :id_p");
                $stmt->bindParam(":cod", $cod, PDO::PARAM_STR);
                $stmt->bindParam(":nombreProd", $nombreProd, PDO::PARAM_STR);
                $stmt->bindParam(":proveedor", $proveedor, PDO::PARAM_STR);
                $stmt->bindParam(":existencia", $existencia, PDO::PARAM_STR);
                $stmt->bindParam(":ref_compra", $ref_compra, PDO::PARAM_STR);
                $stmt->bindParam(":id_p", $id_p, PDO::PARAM_INT);

                foreach ($_POST['id_p'] as $i => $id_p) {
                    $cod = $_POST['cod'][$i];
                    $nombreProd = $_POST['nombreProd'][$i];
                    $proveedor = $_POST['proveedor'][$i];
                    $existencia = $_POST['existencia'][$i];
                    $ref_compra = $_POST['ref_compra'];
                    $id_p = $_POST['id_p'][$i];
                    $stmt->execute();
                }
                $conn->commit();
            }

编辑

这是我的多个插入代码:

            $conn->beginTransaction();
            $sql = "INSERT INTO PRODUCTOS
            (cod, nombreProd, proveedor, existencia, compra, tCompra, f_vencimiento, id_user, nombre, ref_compra, f_compra)
             VALUES ";
            $insertQuery = array();
            $insertData = array();
            foreach ($_POST['cod'] as $i => $cod) {
                $insertQuery[] = '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
                $insertData[] = $_POST['cod'][$i];
                $insertData[] = $_POST['nombreProd'][$i];
                $insertData[] = $_POST['proveedor'][$i];
                $insertData[] = $_POST['existencia'][$i];
                $insertData[] = $_POST['compra1'][$i];
                $insertData[] = $_POST['total1'][$i];
                $insertData[] = $_POST['f_vencimiento'][$i];
                $insertData[] = $_POST['id_user'];
                $insertData[] = $_POST['nombre'];
                $insertData[] = $_POST['ref_compra'];
                $insertData[] = $_POST['fecha'];
            }
            if (!empty($insertQuery)) {
                $sql .= implode(', ', $insertQuery);
                $stmt = $conn->prepare($sql);
                $stmt->execute($insertData);
            }
            $conn->commit();

【问题讨论】:

  • 您的 PHP 中没有 INSERTDELETE 代码,您为什么会期望这种情况发生?
  • 您可以使用REPLACEINSERTUPDATE 组合在一个查询中。但是你需要单独做DELETE
  • @Barmar 有了多行,我不知道在哪里或如何进行查询......这个多重插入对我来说是全新的......对不起
  • 只有在REPLACE 语句中指定id = NULL 时才会分配新ID。
  • 您应该在表单中添加一个Delete 复选框。将 ID 放入复选框的值中。然后你可以遍历$_POST['delete'] 并删除所有这些行。

标签: mysql arrays for-loop foreach multiple-insert


【解决方案1】:

下面介绍如何组合 INSERTUPDATE 代码。表单在插入的行中应该有一个空的id_p 字段。此代码用INSERT 中的NULL 替换它,它告诉数据库使用自动增量分配它。 ON DUPLICATE KEY 子句使用VALUES() 函数从被插入的行中获取值。

       $conn->beginTransaction();
        $sql = "INSERT INTO PRODUCTOS
        (id_p, cod, nombreProd, proveedor, existencia, compra, tCompra, f_vencimiento, id_user, nombre, ref_compra, f_compra)
         VALUES ";
        $insertQuery = array();
        $insertData = array();
        foreach ($_POST['cod'] as $i => $cod) {
            if (isset($_POST['delete']) && in_array($_POST['id_p'][$i], $_POST['delete'])) {
                // Skip rows that are being deleted
                continue;
            }
            $insertQuery[] = '(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
            $insertData[] = $_POST['id_p'][$i] == '' ? null : $_POST['id_p'][$i];
            $insertData[] = $_POST['cod'][$i];
            $insertData[] = $_POST['nombreProd'][$i];
            $insertData[] = $_POST['proveedor'][$i];
            $insertData[] = $_POST['existencia'][$i];
            $insertData[] = $_POST['compra1'][$i];
            $insertData[] = $_POST['total1'][$i];
            $insertData[] = $_POST['f_vencimiento'][$i];
            $insertData[] = $_POST['id_user'];
            $insertData[] = $_POST['nombre'];
            $insertData[] = $_POST['ref_compra'];
            $insertData[] = $_POST['fecha'];
        }
        if (!empty($insertQuery)) {
            $sql .= implode(', ', $insertQuery);
            $sql .= " ON DUPLICATE KEY UPDATE
                    cod = VALUES (cod), nombreProd = VALUES (nombreProd), proveedor = VALUES (proveedor), existencia = VALUES (existencia), ref_compra = VALUES (ref_compra)"
            $stmt = $conn->prepare($sql);
            $stmt->execute($insertData);
        }
        $conn->commit();

对于删除,您应该在每一行中有一个Delete 复选框:

Delete <input type="checkbox" name="delete[]" value="$row[id_p]">

然后您可以在一个查询中删除它们:

if (!empty($_POST['delete'])) {
    $sql = "DELETE FROM PRODUCTOS WHERE id_p IN (";
    $sql .= str_repeat("?, ", count($_POST['delete']) - 1);
    $sql .= "?)";
    $stmt = $conn->prepare($sel);
    $stmt->execute($_POST['delete']);
}

【讨论】:

  • 您的脚本几乎非常棒,现在,当我进行更新或插入脚本时,它会执行此操作,但会出现以下警告:Warning: in_array() expects parameter 2 to be array, null given 在表格的每一行中(例如,如果有 5 行有 5 个警告),如果我试图删除某些产品,请告诉我:Fatal error: Call to undefined function array_repeat()
  • 在检查之前需要检查是否设置了$_POST['delete']。如果没有删除任何内容,则不会发送该参数。
  • array_repeat 应该是 str_repeat,对此感到抱歉。
  • 警告消失了,但是当我尝试删除该行时,请告诉我:数组中的Error: SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty 是用数字捕获 delete[],例如 = 8 但不要删除 id
  • 如果要添加到项目,SQL 应该类似于SET existence = existence + :quantity。然后每一行将添加到前一行所做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2017-07-05
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多