0

私は、eコマースシステム内で注文された回線に関連する保存されたデータを処理する方法の背後にある私の論理であると想定することに問題があります。

2つのアレイがあります。1つの配列(orderedItems)は、注文された製品に関連するさまざまな製品IDを追跡します。もう1つの配列(orderedItemQuantity)は、さまざまな製品IDと、注文された製品の数量値を追跡します。

それでは、データをというテーブルに挿入し始めたいと思いますorder_items。このテーブルには、id(注文ID番号)、、、itemIdおよびquantityの4つの列がありtotalValueます。したがって、注文された各アイテムには、それに対応する情報が挿入された行がこのテーブルに追加されます。

これが私が念頭に置いていたコードです:

// 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)これは、句によってトリガーされます。

私がここから離れているかどうか誰かに教えてもらえますか?これは単に物事が機能する方法ではありません。もしそうなら、私がやろうとしていることの解決策を提案していただけませんか。

一方、これが可能である場合、それが私のために機能しない理由を私に説明してください。愛のためでもお金のためでも…それはただのことではありません、そして私はこの考えが根本的に欠陥があると思います。

これとあなたが共有したいと思うかもしれない提案、入力、アドバイスまたは知識を読んでくれてありがとう!

4

1 に答える 1

1

申し訳ありませんが、表示されているエラーメッセージは、ここでの最後の問題です。

私は2つのアレイを持っています

これは明らかに間違っています-単一の配列である必要があります。

もう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 に答える