0

我正在尝试对购物车进行编码,更具体地说,是对已添加到购物车中的商品进行总计。

我有一些代码应该将产品价格添加到“订单总额”变量中。

它检查会话变量中是否存在值,然后根据存储在 mysql 表中的结果行 id 检查这些“id”。对于会话值中的每个 id,相应的价格将添加到总价中。

如果该项目存在特价,则该价格成为价格。

但是,现在实际发生的情况是,当我将一件商品添加到购物车时。总起来没问题。当我将两件商品添加到购物车时,我只看到添加到购物车的第一件商品的总价值。

由于这是一些旧代码的转换(到准备好的语句),我假设在某个地方我错过了这个的一些关键方面......像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 与任何其他脚本语言在转换字符串-> 整数方面具有几乎相同的语义——从字符串开头到第一个非数字的所有数字都被视为要转换的数字,其余的被丢弃。

于 2012-07-14T17:07:46.643 回答