2012-04-21 6 views
1

Hy、PHPショッピングカートで注文を表示

私はトレーニング目的でPHPショップを作成しています。私はユーザーが最後に発注した注文を見ることができるようにしたいが、これを実現するには問題がある。

顧客(子供、名前、住所、...)
製品(PID、PRODUCT_NAME、PRODUCT_DESCRIPTION、価格)
注文

私は、データベース内のこれらのテーブルをしました - > OID、子供、支払い、住所、状況
order_detail - > OID、日付、PID、数量)

[OK]を、私は、クエリの取得は、データベースから必要なデータをだ機能を作成しました、私が何をしたいのか

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 |製品名|数量|価格|ステータス) 注文には1つの商品のみが含まれていますが、注文が大きくなると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)を使用し、代わりにあなたが唯一の連想キーを使用している場合、'、それはメモリと繰り返しスピード –

答えて

0

問題はあなたが製品テーブルから選択されていませんされています。選択したクエリはorders.*で、orders tableの下にあるすべての列にすぎません。ソリューションは、選択したクエリに商品列を追加することです。

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

が保存されます私はあなたの声明を試しましたが、dbエラーがありました。製品表から私は十分な情報を得たと思う。 この構造のテーブルを作成したいと思う:orderid |製品名|数量|価格|ステータス 注文が1つの製品(私のケースではoid 1)のみを含む場合、テーブルを作成するのに問題ありませんが、oid2には3つの製品が含まれています。そこには1つの製品しかありません – boesl

+0

最初に、データのクエリには、いくつかのタイプミスが修正されました。他のものは 'order'テーブルです。'order'はmysqlの予約語です。私はそれを「命令」に変更しました。私はあなたが上に投稿した構造についてのクエリを試しました、そして、それは編集された答えに言及された2行を返しました。 –

0

あなたのコードでは、whileループとを入力:ここ

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

は、私が持っている結果である:あなたが明示的に内部結合を使用している理由は、私は非常にわからない、鉱山はこのようなものになるだろう

$lastoid = 0; 

$ lastoidが$ i ['oid']と等しくないため、最初のwhileループが実行されます。 1つはゼロ、もう1つはゼロです。次の行では、$ 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']; 
    } 
} 
関連する問題