我正在尝试对购物车进行编码,更具体地说,通过添加到购物车中的项目总数。
我有一些代码,应该将产品价格添加到变量"订单总额"中。
它检查会话变量内部是否有值,然后将这些"id"与存储在mysql表中的结果行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();
}
}
把这个放在这里,因为它在注释中太难看了。注意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时具有几乎相同的语义-从字符串开头到第一个非数字的所有数字都被视为要转换的数字,其余的都被丢弃。