2012-04-21 4 views
1

Hy,PHP корзина с заказами

Я создаю магазин PHP для учебных целей. Я хочу, чтобы пользователь дал возможность просмотреть последние заказы, которые он разместил, но у меня есть проблемы, чтобы понять это.

Я эти таблицы в моей базе данных:

клиента (ребенок, имя, адрес, ...)
продуктов (ИДП, product_name, PRODUCT_DESCRIPTION, цена)
заказов -> подъязычная, малыш, способ оплаты, адрес, статус
order_detail -> подъязычная, дата, PID, количество)

нормально, я создал функцию, когда прибудут запросы Query необходимых данные из базы данных

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 | название продукта | количество | цена | status) работает, если заказ содержит только один продукт, но если заказ становится больше (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. Решение состоит в том, чтобы добавить столбцы продуктов в ваш выбранный запрос. Я не очень уверен, почему вы явно с помощью внутреннего соединения, шахта будет что-то вроде этого:

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

Я попробовал ваше заявление, но получил ошибку db. Из таблицы продуктов я получаю достаточно информации. Я думаю, Я хочу создать таблицу с этой структурой: orderid | название продукта | количество | цена | status Если заказ содержит только один товар (в моем случае 1-й вариант), нет проблем с созданием таблицы - но oid2 содержит 3 продукта, там я получаю только 1 продукт – boesl

+0

Первое, что я никогда не пробовал запрос на данные, были некоторые опечатки, которые теперь исправлены. Другая вещь 'order' table.'order' является зарезервированным словом в mysql. Я изменил его на «заказы». Я попробовал запрос по структуре, которую вы разместили выше, и возвратил 2 строки, о которых упоминается в отредактированном ответе. –

0

Ваш код входит в то время цикла с

$lastoid = 0; 

Он будет работать первый в то время как цикл, потому что $ lastoid не равна $ я [ «подъязычная»]. Один равен нулю, другой - один. В следующей строке вы присваиваете значение $ 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']; 
    } 
}