2012-07-14 73 views
0

我試圖編碼一個購物車,更具體地說,雖然已經添加到購物車的項目的總和。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(); 
    } 
} 
+0

準備好的語句對'IN(?)'類型的東西無法正常工作。佔位符字面上被視爲SINGLE值。插入一串逗號分隔值不會將其視爲一組逗號分隔值。它只是一個單一的單一字符串。它將被視爲'where x ='1,2,3'',而不是'where(in(1,2,3)')。 – 2012-07-14 16:10:12

+0

@MarcB嗯,好吧非常感謝你,我明白你在說什麼...但是這並不會讓事情變得更容易。當然,這些價值觀應該以這種方式來準備,所以我的意思是......我會如何努力去完成這樣的事情? – 2012-07-14 16:15:05

+0

如果這是在mysql上,你可以使用'FIND_IN_SET()',其中一個準備好的語句和一個佔位符可以工作。否則,通常的解決方法是動態構建一個'?,?,?,?,...'字符串,以匹配您在in()'子句中使用的許多值,並在飛。痛苦的,但這是一個主要的地方,準備好的陳述/佔位符在他們的臉上平坦並流血。 – 2012-07-14 16:16:26

回答

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與其他任何腳本語言一樣,轉換strings-> ints的語義幾乎相同 - 從字符串開頭到第一個非數字的所有數字都被視爲要轉換的數字,其餘的都被丟棄。

+0

好的,謝謝Marc,這使得更多的意義! – 2012-07-15 07:12:11