以多行形式插入、更新或删除
Insert, update or delete in multiple row form
我需要知道如果在发票表格中我对产品进行了一些更改,如编辑、删除,我该如何在多行中制作 INSERT
、UPDATE
或 DELETE
其他或通过一个查询添加新的...我尝试更新但是如果我删除一两个产品或者如果我添加一个或两个并保存表格,在 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();
以下是合并 INSERT
和 UPDATE
代码的方法。表单在插入的行中应该有一个空的 id_p
字段。此代码将 NULL
替换为 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']);
}
我需要知道如果在发票表格中我对产品进行了一些更改,如编辑、删除,我该如何在多行中制作 INSERT
、UPDATE
或 DELETE
其他或通过一个查询添加新的...我尝试更新但是如果我删除一两个产品或者如果我添加一个或两个并保存表格,在 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();
以下是合并 INSERT
和 UPDATE
代码的方法。表单在插入的行中应该有一个空的 id_p
字段。此代码将 NULL
替换为 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']);
}