【问题标题】:PHP shopping cart showing orders显示订单的 PHP 购物车
【发布时间】:2012-05-03 02:15:43
【问题描述】:

喂,

我正在创建一个用于培训目的的 PHP 商店。我希望用户能够查看他最近下的订单 - 但我很难实现这一点。

我的数据库中有这些表:

客户(孩子、姓名、地址……)
产品(pid、产品名称、产品描述、价格)
订单 --> oid、kid、付款、地址、状态
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 个产品),则只显示第一个。

$database 如下所示:

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
    )
)  

【问题讨论】:

  • 请注意:如果您只使用关联键,请改用fetchAll(PDO::FETCH_ASSOC);,这样可以节省内存和迭代速度

标签: php mysql multidimensional-array pdo shop


【解决方案1】:

问题是您没有从产品表中进行选择。你的select查询就是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        |

【讨论】:

  • 我试过你的说法,但得到一个 db 错误。从 products 表中我得到足够的信息我想我想创建一个具有这种结构的表:orderid |产品名称 |数量 |价格 |如果订单仅包含一种产品(在我的情况下为 oid 1),则创建表没有问题 - 但 oid2 包含 3 种产品,我只得到 1 种产品
  • 第一件事,因为我从未尝试过数据查询,所以现在修复了一些拼写错误。另一件事order 表。 order 是 mysql 中的保留字。我将其更改为orders。我尝试了对您在上面发布的结构的查询,它返回了编辑答案中提到的 2 行。
【解决方案2】:

您的代码通过

进入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'];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多