PHP-MYSQLI-准备好的语句-通过循环结果获得总计值


PHP - MYSQLI - Prepared statements - Looping though results to obtain values to total?

我正在尝试对购物车进行编码,更具体地说,通过添加到购物车中的项目总数。

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

它检查会话变量内部是否有值,然后将这些"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时具有几乎相同的语义-从字符串开头到第一个非数字的所有数字都被视为要转换的数字,其余的都被丢弃。