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

时间:2012-07-30 11:43:09

标签: php loops mysqli prepared-statement

我遇到的问题是我的假设是如何处理与电子商务系统中订购的行相关的存储数据。

我有两个数组。一个数组(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)子句触发的。

有人可能会告诉我,如果我离开这里,这根本不是事情的方式。如果是这种情况,你能否为我想做的事情提出一个解决方案。

如果另一方面这是可能的,请你解释一下为什么它不适合我。因为爱情和金钱......它只是不会,我认为这个想法存在根本缺陷。

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

1 个答案:

答案 0 :(得分: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整理其余代码也应该正确解决错误。