0

より具体的には、ショッピング カートに追加されたアイテムの合計を使用して、ショッピング カートをコーディングしようとしています。

「注文合計」である変数に製品価格を追加することになっているコードがいくつかあります。

セッション変数内に値があるかどうかを確認し、それらの「ID」を mysql テーブルに格納されている結果の行 ID と照合します。セッション値の各 ID について、対応する価格が合計に追加されます。

この商品に特別価格が存在する場合は、その価格が価格になります。

ここで実際に起こっていることは、カートに 1 つのアイテムを追加したときです。合計しても問題ありません。カートに 2 つのアイテムを追加すると、最初にカートに追加されたアイテムの合計値しか表示されません。

これはいくつかの古いコードの (準備されたステートメントへの) 変換であるため、リングのどこかでこの重要な側面を見逃していると思います... のようなものmysqli_data_seek

現時点では、準備されたステートメントに関する私の知識は十分ではないため、ループが発生する方法を間違えている可能性があります。

誰かがこれを調べて、私がコーディングした問題を見つけたり、このタスクをより良い方法で達成する方法についての情報を提供したりできれば...それはすべて非常に高く評価されます!

ありがとうございました

コードは次のとおりです。

if (isset($_SESSION['orderItem']) && count($_SESSION['orderItem']) > 0)
{
    $ordersItem = sanitize($_SESSION['orderItem']);
    $ordersItemJoined = join($ordersItem, ',');
    if ($stmt = $link->prepare("
        SELECT i.id, i.price, s.specialPrice, s.start, s.end 
        FROM items i
        LEFT JOIN item_specials s
        ON s.id = i.id
        WHERE i.id 
        IN (?)
    "))
    {   
        $stmt->bind_param("i", $ordersItemJoined);
        $stmt->execute();
        $stmt->bind_result($itemsId, $itemsPrice, $itemsSpecialPrice, $itemsSpecialStart, $itemsSpecialEnd);

        while ($stmt->fetch())
        {
            // Apply sale price if it exists
            if ($itemsSpecialPrice > 0)
            {
                if ( ($itemsSpecialStart < date('Y-m-d H:i:s')) && ($itemsSpecialEnd > date('Y-m-d H:i:s')) )
                {
                    $itemsPrice = $itemsSpecialPrice;
                }
            }

            $itemsQuantity = sanitize($_SESSION['itemQuantity'][$itemsId]);
            foreach ($ordersItem as $itemToTotal)
            {
                if ($itemToTotal == $itemsId) 
                {
                    $cartTotal += $itemsPrice*$itemsQuantity;
                }
            }
        }
        $stmt->close();
    }
}
4

1 に答える 1

1

コメントではあまりにも醜いので、これをここに入れます。値を囲む引用符に注意してくださいin()。これにより、個々の値を再度チェックするのではなく、モノリシックな文字列にする必要があります。

mysql> create table foo (bar int);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into foo (bar) values (1);
Query OK, 1 row affected (0.05 sec)

mysql> select * from foo where bar in ('1,2');
+------+
| bar  |
+------+
|    1 |
+------+
1 row in set, 1 warning (0.02 sec)

mysql> select * from foo where bar in ('2,1');
Empty set, 1 warning (0.00 sec)

mysql> 

そうです、フィールドの値がたまたまプレースホルダーに入れている CSV の最初の値と一致するため、一致が得られます。MySQL は、文字列から int への変換に関して、他のスクリプト言語とほぼ同じセマンティクスを持っています。文字列の先頭から最初の非数字までのすべての数字が変換対象の数字として扱われ、残りは破棄されます。

于 2012-07-14T17:07:46.643 に答える