PHP/MySQL-Mysqli-Prepared Statements-循环时在另一个select语句中运行多个ins


PHP/MySQL - Mysqli - Prepared Statements - Run multiple insert statements within another select statement while loop?

我认为如何处理与电子商务系统中订购的行相关的存储数据背后的逻辑有问题。

我有两个数组。一个数组(orderedItems)跟踪与订购产品相关的各种产品id。另一个数组(orderedItemQuantity)跟踪各种产品id以及订购产品的数量值。

现在我想开始将数据插入一个名为order_items的表中。此表有四列,即id(订单id号)、itemIdquantitytotalValue。因此,每个已排序的项目都会在该表中添加一行,并插入相应的信息。

这是我脑海中的代码:

// Loop through ordered items
if ($stmt = $link->prepare("
    SELECT name, price
    FROM items i
    IN (".join($_SESSION['orderedItems'], ',').")
"))
{   
    $stmt->execute();
    $stmt->bind_result($itemName, $itemPrice);
    while ($stmt->fetch())
    {
        $itemQuantity = sanitize($_SESSION['orderedItemQuantity']["$itemId"]);
        $lineTotal = number_format($itemPrice * $itemQuantity, 2);
        // Insert each item line to database ''
        $stmt2 = $link->prepare("
            INSERT INTO order_items SET
            id = ?,
            itemId = ?,
            itemQuantity = ?,
            lineValue = ?
        ");
        if (!$stmt2)
        {
            $error = "Error {$link->errno}  :  {$link->error}";
            include "$docRoot/html/main/error.html.php";
            exit();
        }
        if (!$stmt2->bind_param("iiis", $orderId, $itemId, $itemQuantity, $lineTotal))
        {
            $error = "Error {$link->errno}  :  {$link->error}";
            include "$docRoot/html/main/error.html.php";
            exit();
        }
        if (!$stmt2->execute())
        {
            $error = "Error {$link->errno}  :  {$link->error}";
            include "$docRoot/html/main/error.html.php";
            exit();
        }
        $stmt2->close();
    }
    $stmt->close();
}

然而,当我尝试运行它时,我得到了mysql错误代码2014:命令不同步;您现在无法运行此命令。这是由if (!stmt2)子句触发的。

有人能告诉我,我是否离这里很远,而这根本不是事情的运作方式。如果是这样的话,你能为我试图做的事情提出一个解决方案吗?

另一方面,如果这是可能的,你能向我解释一下为什么它对我不起作用吗?因为无论是为了爱情还是金钱。。。它只是不会,我认为这个想法从根本上是有缺陷的。

感谢您花时间阅读本文,以及您可能愿意分享的任何建议、意见、建议或知识!!

很抱歉,您看到的错误消息是最后一个问题。

我有两个阵列

这显然是错误的——它应该是一个单独的数组。

另一个数组(orderedItemQuantity)跟踪各种产品id以及订购的产品的数量值

呃,从代码来看,这似乎是一个嵌套数组。

if ($stmt = $link->prepare("
  SELECT name, price
  FROM items i
  IN (".join($_SESSION['orderedItems'], ',').")
"))

当你在没有转义的情况下拼接文字值时,你为什么要麻烦准备好的语句?

while($stmt->fetch())。。。$stmt2=$link->准备("

永远不要在循环中执行SQL语句。

处理错误消息是微不足道的-只需使用单独的数据库连接-但它不会解决代码中更深层次的问题-OTOH整理代码的其余部分也应该能正确解决错误。