【发布时间】:2019-11-05 08:54:44
【问题描述】:
我有以下 PHP 代码,它从另一个文件中提取已发布的表单数据,执行 SELECT 查询以从各种表(SalesDB、CustDB 和 ProdDB)中查找所有相关数据,然后执行 INSERT INTO 查询以添加行到“SalesDB”表中。表单具有动态添加的行,这为每个新添加的行提供了唯一的 ID,例如:
...<input type="text" id="prodName_1" name="prodName[]" value="">
...<input type="text" id="prodName_2" name="prodName[]" value="">
.
.
...<input type="text" id="prodName_Z" name="prodName[]" value="">
但是,当 PHP 脚本运行时,例如3 行产品线,它只执行第一次迭代的 $queryinsert 查询并插入表单的第一个产品线。为什么它不会循环遍历数组?请参阅下面的 php 脚本:
<?php
$db = new SQLite3('../xxx.db');
if(!$db){
echo $db->lastErrorMsg();
exit;
}
if (empty($_POST['custID'])) {
$errorMSG = array("No customer selected");
echo json_encode($errorMSG, JSON_PRETTY_PRINT);
exit;
} else {
$custID = $_POST['custID'];
$queryInsert = $db->prepare("INSERT INTO 'SalesDB'
(SalesID,CustID,ProdID,ProdQty,ProdPrice,ProdCurr,ProdVAT,SalesPrice,SalesVAT,SalesSum)
VALUES (?,?,?,?,?,?,?,?,?,?)");
$queryInsert->bindParam(1,$salesID);
$queryInsert->bindParam(2,$custID);
$queryInsert->bindParam(3,$prodID);
$queryInsert->bindParam(4,$prodQty);
$queryInsert->bindParam(5,$prodPrice);
$queryInsert->bindParam(6,$prodCurr);
$queryInsert->bindParam(7,$prodVAT);
$queryInsert->bindParam(8,$salesPrice);
$queryInsert->bindParam(9,$salesVAT);
$queryInsert->bindParam(10,$salesSum);
$querySalesID = "SELECT MAX(SalesID) AS max_SalesID FROM 'SalesDB'";
$resultSalesID = $db->query($querySalesID);
while ($row = $resultSalesID->fetchArray()) {
$salesID = $row['max_SalesID'] + 1;
}
foreach($_POST['prodName'] as $prodName => $value) {
if (!$value) {
$errorMSG = array("Empty product fields");
echo json_encode($errorMSG, JSON_PRETTY_PRINT);
exit;
} elseif ($value == "Product not found") {
$errorMSG = array("Invalid products in order form");
echo json_encode($errorMSG, JSON_PRETTY_PRINT);
exit;
}
$queryProd = "SELECT * FROM `ProdDB` WHERE ProdName LIKE '%$value%'";
$resultProd = $db->query($queryProd);
while ($row = $resultProd->fetchArray()) {
$prodID = $row['ProdID'];
$prodPrice = $row['ProdPrice'];
$prodQty = $row['ProdQty'];
$prodVAT = $row['ProdVAT'];
$prodCurr = $row['ProdCurr'];
$salesPrice = $prodQty * $prodPrice;
$salesVAT = number_format($prodQty * $prodPrice * $prodVAT,2);
$salesSum = $salesPrice + $salesVAT;
}
$result = $queryInsert->execute();
}
}
?>
还请注意,我知道我(很可能)在安全实践或编程标准方面犯了很多错误,但整个事情 (PHPDesktop > https://github.com/cztomczak/phpdesktop) 将被打包到一个 EXE 文件中它将仅在本地运行(不需要在线连接,因为 SQLite3 DB 与 EXE 打包在一起),而且我仍在研究如何首先对其进行编程,因此高效和整洁的编码在我的列表中并不高然而;-)
【问题讨论】:
-
@04FS 只有在 $_POST 为空或值为“未找到产品”时才会触发退出注释。如果两者都不适用,它将跳过此代码并继续执行 $queryProd 语句,该语句没有退出语句。
-
“为什么它不循环遍历数组?” - 你真的验证过它没有这样做吗?您的查询没有错误控制 - 所以谁说
$queryInsert->execute()不只是默默地失败了? -
@04FS 如果我要插入3行数据,执行脚本后我只能看到第一行添加到数据库中,而第二行和第三行不在数据库中。
-
这正是我所指的完全 - 您只查看结果,而不是检查脚本中实际发生的情况!去正确地调试它。首先检查您的数据库查询是否真的成功 - 在您的脚本中。
-
@RoyMonden 嗨,如果我的回答对您有帮助,请将其标记为已接受(带有绿色 V)
标签: php phpdesktop