我有下面的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文件仅在本地运行(由于EXE打包在SQLite3 DB中,因此无需在线连接),而且我仍在弄清楚如何对此进行编程,因此高效和整洁的编码并不高我的清单了;-)
答案 0 :(得分:1)
脚本中存在一些问题:
1),而不是在exit
内进行foreach
,而是进行continue
来跳过单个实际迭代。
continue用于循环结构中,以跳过其余的 当前循环迭代并在条件下继续执行 评估,然后开始下一次迭代。
尝试以下代码:
foreach($_POST['prodName'] as $prodName => $value) {
if (!$value) {
$errorMSG = array("Empty product fields");
echo json_encode($errorMSG, JSON_PRETTY_PRINT);
continue;
} elseif ($value == "Product not found") {
$errorMSG = array("Invalid products in order form");
echo json_encode($errorMSG, JSON_PRETTY_PRINT);
continue;
}
$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();
}
2)您的查询使用的是用户输入而没有检查其内容,因此您的脚本可能会向SQLInjection打开!
$queryProd = "SELECT * FROM `ProdDB` WHERE ProdName LIKE '%$value%'";
3)如果查询没有返回任何内容,则脚本不会进入while
循环,因此似乎foreach
仅执行一次迭代,而是执行一次迭代由于该查询的结果为空,因此无需输入while
即可执行所有迭代。
我建议您使用var_dump
打印变量内容来调试所有代码,例如:
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);