2012-04-21 98 views
1

海蘭,PHP購物車顯示訂單

我創建了培訓目的的PHP店。我希望用戶有可能查看他放置的最後一個訂單 - 但我有問題要意識到這一點。

我在我的數據庫這些表:

客戶(孩子姓名,地址,...)
產品(PID,PRODUCT_NAME,PRODUCT_DESCRIPTION,價格)
訂單 - > OID,孩子,支付,地址,狀態
order_detail - > OID,日期,PID,數量)

好吧,我創建了一個函數,其中一個查詢從數據庫中獲取的所需數據

function showOrder($kid) 
{ 
$db = database(); 
$orders = $db->query ("SELECT * FROM orders 
    INNER JOIN order_detail on orders.oid=order_detail.oid 
    INNER JOIN products on order_detail.pid = products.pid 
    WHERE kid='$kid' "); 

$orders = $orders->fetchAll(); 

$lastoid = 0; 
foreach($orders as $i){ 

    while($lastoid != $i['oid']) { 
     $lastoid = $i['oid']; 
     echo "Ordernr: ".$lastoid."<br/>"; 
     echo "Produktname: ".$i['product_name']."<br>"; 
     echo "Menge: ".$i['quantity']."<br/>"; 
     echo "Preis: ".$i['price']."<br/>"; 
     echo "Status: ".$i['status']."<br/>"; 
     echo "<br/><br/><hr/>";  
    } 
} 
} 

我想要做的:在一個表( 列表中的單筆訂單 - > oderid |產品名稱|數量|價格|狀態) 如果訂單僅包含一種產品,但是如果訂單變得更大(2種產品),則僅顯示第一種產品。

$數據庫看起來是這樣的:

Array 
(
[0] => Array 
    (
     [oid] => 1 
     [0] => 1 
     [kid] => 1 
     [1] => 1 
     [2] => 1 
     [date] => 2012-04-17 
     [3] => 2012-04-17 
     [pid] => 1 
     [4] => 1 
     [quantity] => 2 
     [5] => 2 
     [payment] => Nachnahme 
     [6] => Nachnahme 
     [street] => teststraße 
     [7] => teststraße 
     [number] => 2 
     [8] => 2 
     [zip] => 2222 
     [9] => 2222 
     [city] => Teststadt 
     [10] => Teststadt 
     [status] => in Bearbeitung 
     [11] => in Bearbeitung 
     [12] => 1 
     [product_name] => Acer Laptop 
     [13] => Acer Laptop 
     [price] => 29.00 
     [14] => 29.00 
     [details] => blabla 
     [15] => blabla 
     [category] => Laptop 
     [16] => Laptop 
     [date_added] => 2012-04-05 
     [17] => 2012-04-05 
    ) 

[1] => Array 
    (
     [oid] => 1 
     [0] => 1 
     [kid] => 1 
     [1] => 1 
     [2] => 1 
     [date] => 2012-04-17 
     [3] => 2012-04-17 
     [pid] => 2 
     [4] => 2 
     [quantity] => 2 
     [5] => 2 
     [payment] => Nachnahme 
     [6] => Nachnahme 
     [street] => teststraße 
     [7] => teststraße 
     [number] => 2 
     [8] => 2 
     [zip] => 2222 
     [9] => 2222 
     [city] => Teststadt 
     [10] => Teststadt 
     [status] => in Bearbeitung 
     [11] => in Bearbeitung 
     [12] => 2 
     [product_name] => Grundig TV 
     [13] => Grundig TV 
     [price] => 22.00 
     [14] => 22.00 
     [details] => blabla 

     [15] => blabla 
     [category] => TV 
     [16] => TV 
     [date_added] => 2012-04-05 
     [17] => 2012-04-05 
    ) 

[2] => Array 
    (
     [oid] => 1 
     [0] => 1 
     [kid] => 1 
     [1] => 1 
     [2] => 1 
     [date] => 2012-04-17 
     [3] => 2012-04-17 
     [pid] => 7 
     [4] => 7 
     [quantity] => 1 
     [5] => 1 
     [payment] => Nachnahme 
     [6] => Nachnahme 
     [street] => teststraße 
     [7] => teststraße 
     [number] => 2 
     [8] => 2 
     [zip] => 2222 
     [9] => 2222 
     [city] => Teststadt 
     [10] => Teststadt 
     [status] => in Bearbeitung 
     [11] => in Bearbeitung 
     [12] => 7 
     [product_name] => Nokia Handy 
     [13] => Nokia Handy 
     [price] => 69.00 
     [14] => 69.00 
     [details] => blabla 
     [15] => blabla 
     [category] => Handy 
     [16] => Handy 
     [date_added] => 2012-04-06 
     [17] => 2012-04-06 
    ) 

[3] => Array 
    (
     [oid] => 2 
     [0] => 2 
     [kid] => 1 
     [1] => 1 
     [2] => 2 
     [date] => 2012-04-17 
     [3] => 2012-04-17 
     [pid] => 8 
     [4] => 8 
     [quantity] => 1 
     [5] => 1 
     [payment] => Vorauskasse 
     [6] => Vorauskasse 
     [street] => musterstraße 
     [7] => musterstraße 
     [number] => 1 
     [8] => 1 
     [zip] => 1111 
     [9] => 1111 
     [city] => stadt 
     [10] => stadt 
     [status] => in Bearbeitung 
     [11] => in Bearbeitung 
     [12] => 8 
     [product_name] => PC groß 
     [13] => PC groß 
     [price] => 66.00 
     [14] => 66.00 
     [details] => blabla 
     [15] => blabla 
     [category] => Computer 
     [16] => Computer 
     [date_added] => 2012-04-06 
     [17] => 2012-04-06 
    ) 
) 
+0

**剛一說明:**使用'使用fetchall(PDO :: FETCH_ASSOC);'如果不是您只能使用關聯的密鑰,這將節省內存和迭代速度 – 2012-04-22 00:07:25

回答

0

問題是你是不是從產品表中選擇。您的選擇查詢只是orders.*,這只不過是orders table下的所有列。解決方案是將產品列添加到您的選擇查詢。我不是很清楚爲什麼你明確地使用內部連接,我的將是這樣的:

select orders.*, products.* from orders,order_detail,products where 
orders.oid=order_detail.oid and order_detail.pid=products.pid and orders.kid=1 

下面是結果我有:

| oid | kid | pid | product_name | 
| 1 | 1 | 1 | camera  | 
| 1 | 1 | 2 | pants  | 
+0

我嘗試了你的陳述,但得到了數據庫錯誤。從產品表中,我獲得了足夠的信息,我認爲 我想創建一個具有此結構的表:orderid |產品名稱|數量|價格|狀態 如果一個訂單隻包含一個產品(在我的情況OID 1)這是沒有問題的創建表 - 但OID2包含了3個款產品,還有我只得到1種產品在它 – boesl 2012-04-22 10:40:02

+0

第一件事,第一,因爲我從來沒有試過對數據的查詢,現在有些拼寫錯誤已經修復。另一件事'訂單'表。'order'是mysql中的一個保留字。我將它改爲'orders'。我對上面發佈的結構進行了查詢,並返回了2行,它在編輯的答案中提到。 – 2012-04-22 11:51:37

0

你的代碼進入while循環用

$lastoid = 0; 

它將運行在第一個while循環,因爲$ lastoid不等於$ I [ 'OID']。一個是零,另一個是一個。在下一行中,將$ i ['oid']的值賦給$ lastoid。這使他們平等,你的while循環將停止。如果循環不會中斷,那麼您將擁有無盡的相同信息。在while循環有下一順序沒有提及。

更改像這樣

$lastoid = 1; 
foreach($orders as $key => $value){ 

    if($lastoid == $value[$key]['oid']) { 
     echo "Ordernr: ".$lastoid."<br/>"; 
     echo "Produktname: ".$i['product_name']."<br>"; 
     echo "Menge: ".$i['quantity']."<br/>"; 
     echo "Preis: ".$i['price']."<br/>"; 
     echo "Status: ".$i['status']."<br/>"; 
     echo "<br/><br/><hr/>";  
    } else { 
     $lastoid = $value[$key+1]['oid']; 
    } 
}