繁体   English   中英

PHP Form $_POST foreach 在第一次迭代后停止

[英]PHP Form $_POST foreach stops after first iteration

我有下面的 PHP 代码,它从另一个文件中提取已发布的表单数据,执行 SELECT 查询以查找各种表(SalesDB、CustDB 和 ProdDB)中的所有相关数据,然后执行 INSERT INTO 查询以将一行添加到“销售数据库”表。 该表单具有动态添加的行,这为每个新添加的行提供了唯一的 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 一起打包),我仍然在弄清楚如何首先对其进行编程,所以高效和整洁的编码是在我的名单上还不算高;-)

脚本中存在一些问题:

1)不要在foreachexit ,而是continue跳过单个实际迭代。

官方文档中所述:

continue 用于循环结构中以跳过当前循环迭代的 rest 并在条件评估处继续执行,然后开始下一个迭代。

试试这个代码:

  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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM