【问题标题】:My cart items aren't printing in the same order in which they're placed我的购物车商品的打印顺序与放置它们的顺序不同
【发布时间】:2022-01-20 19:45:17
【问题描述】:

我的代码没有按照我将产品放入购物车会话的顺序打印产品。产品编号如下:
苹果价值 2
黑莓价值 3
绿葡萄价值6
正如您在打印的数组中看到的那样,我将它们放入购物车会话的顺序是葡萄、黑莓和苹果,但由于某种原因,它按给定值的顺序而不是购物车顺序打印。

不过,代码仍会将每个产品视为位于正确位置的产品。例如,假设苹果是购物车数组中葡萄当前所在的第三个项目。如果葡萄的数量按钮改变了,苹果的数量就会改变,因为它仍在正确读取数组。

我怀疑问题出在其中一个循环中,但我似乎找不到它是什么。

<?php

 $total = 0;
 $id_count = 0;

 if(isset($_SESSION['cart']) and count($_SESSION['cart']) > 0){
     
     $product_ID = array_column($_SESSION['cart'],"product_ID");

     $result = $database->getData();

     while($row = mysqli_fetch_assoc($result)){    
        foreach($product_ID as $id){
           if($row['id']==$id){

              print_r($product_ID); 
              print_r($row['product_name:']);
              echo " value: $id";

              $itemQuantity = $_SESSION['cart'][$id_count]['quantity'];
              cartMethod($row['product_name'],$row['product_img'],$row['product_price'], $row['id'], $itemQuantity);
              $total = $total + ($itemQuantity*(float)$row['product_price']);
              $id_count++;
           }
        }
     }
  }
  else{
       echo "<h5>Cart is currently empty</h5>";
  } 
?>

这是位于不同文件中的 getData() 函数。

//get method to retrieve database information
     public function getData(){
          $sql = "SELECT * FROM $this->tablename";

          $result = mysqli_query($this->connection, $sql);

          if(mysqli_num_rows($result)>0){
                    return $result;
          }
     }

【问题讨论】:

  • "SELECT * FROM $this-&gt;tablename" 没有ORDER BY 子句。产品订单信息应该从哪里获得?
  • 关于产品订单的信息应该来自$product_ID= array_column($_SESSION['cart'],"product_ID"); print_r($product_ID) 展示了项目的实际订单应该是什么。 foreach 循环将$product_ID 的每个项目放入$id,然后将其与$row['id'] 进行比较。 $product_ID 中的第一项是 id 值为 6 的 Grapes,但 if() 似乎首先比较 Apples 的 id。

标签: php arrays session foreach e-commerce


【解决方案1】:

您正在从数据库 ($database-&gt;getData()) 中迭代产品目录,然后对其中的每个条目进行交叉检查,如果它存在于 $product_ID 中。

所以有效顺序遵循查询的顺序(可能是ORDER BY id 或我怀疑的东西(我不知道;代码不包括在内)。

修复起来并不难,但是您在这里以一种非常低效的方法构建购物车。在数据库内部进行大量数据整理(这是该页面的大部分内容)会更有意义。

当然,我不知道数据库中的产品目录是什么样的,也不知道$database-&gt;getData()后面隐藏着什么查询,所以我真的不能给出更有针对性的建议。


如果我不得不猜测,我会怀疑$database-&gt;getData() 包含一个查询,例如SELECT * FROM products ORDER BY productid ASC。如果确实如此,那么我将扩展该查询,以便您可以将 $_SESSION['cart'] 数据输入到 SELECT 查询中,并将其与 products 表连接。

这样: A)您可以完全控制订购 B)您只需退回相关产品,而不是“所有”产品,效率更高。 C)您不必在 PHP 中混合和匹配 2 个数据集

【讨论】:

  • 为了清楚起见,我添加了 getData 函数。如果我想将$_SESSION['cart'] 输入到SELECT 查询中,是否需要用$product_ID 变量(包含array_column($_SESSION['cart'],"product_ID"))之类的东西替换星号?
  • 不,您必须将其作为WHEREJOIN 条件引入。公平地说,有 100 种不同的方法可以做到这一点。我想最简单的方法是将整个 $_SESSION['cart'] 变量作为 json 数组推入;或者更草率的是只将 ID 号作为数组推入。
  • 这也可能取决于您是否使用现代版本的 mysql。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2013-01-12
  • 2022-06-17
相关资源
最近更新 更多