我試圖編碼一個購物車,更具體地說,雖然已經添加到購物車的項目的總和。PHP - MYSQLI - 準備好的語句 - 儘管結果循環以獲得總數值?
我有一些代碼應該將產品價格添加到「訂單總額」變量中。
它檢查會話變量內是否有值,然後檢查存儲在mysql表中的結果行id是否存在「id's」。對於會話值中的每個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(?)'類型的東西無法正常工作。佔位符字面上被視爲SINGLE值。插入一串逗號分隔值不會將其視爲一組逗號分隔值。它只是一個單一的單一字符串。它將被視爲'where x ='1,2,3'',而不是'where(in(1,2,3)')。 – 2012-07-14 16:10:12
@MarcB嗯,好吧非常感謝你,我明白你在說什麼...但是這並不會讓事情變得更容易。當然,這些價值觀應該以這種方式來準備,所以我的意思是......我會如何努力去完成這樣的事情? – 2012-07-14 16:15:05
如果這是在mysql上,你可以使用'FIND_IN_SET()',其中一個準備好的語句和一個佔位符可以工作。否則,通常的解決方法是動態構建一個'?,?,?,?,...'字符串,以匹配您在in()'子句中使用的許多值,並在飛。痛苦的,但這是一個主要的地方,準備好的陳述/佔位符在他們的臉上平坦並流血。 – 2012-07-14 16:16:26