0

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

我有两个数组。一个数组 ( 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:Commands out of sync; 您现在无法运行此命令。这是由if (!stmt2)子句触发的。

有人可能会告诉我我是否离开这里,这根本不是事情的运作方式。如果是这种情况,您能否为我正在尝试做的事情提出解决方案。

另一方面,如果这是可能的,请您向我解释为什么它对我不起作用。因为爱情和金钱......它只是不会,我认为这个想法从根本上是有缺陷的。

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

4

1 回答 1

1

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

我有两个数组

这是完全错误的——它应该是一个单一的数组。

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

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

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

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

while ($stmt->fetch()) ... $stmt2 = $link->prepare("

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

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

于 2012-07-30T13:20:49.437 回答