【发布时间】:2021-02-20 08:50:21
【问题描述】:
我正在尝试为用户实现一个购物车对象,将购物车的序列化版本存储在索引“user_cart”的 $_SESSION 超级全局中,但是我遇到了一个问题,我的数据存储在当我移动到新页面时,该索引不再存在。
我确实在每个页面的顶部都有 session_start,当我回显 session_id() 时,我确实在多个页面中获得了相同的会话 ID。此外,当我在两个页面上回显 $_SESSION 时,创建对象的页面正确显示如下:
Array ( [user_cart] => Array ( [count] => 0 [items] => Array ( ) ) )
但是,一旦我实际单击添加到购物车订购东西,然后导航到我的“查看购物车”页面,我会得到以下 $_SESSION 变量:
Array ( [user_cart] => )
它识别出我的 $_SESSION 数组有一个索引“user_cart”,但其中没有存储任何内容。
只有在我首先向购物车添加一些东西时才会发生这种情况,如果我只是去查看购物车页面而不向购物车添加任何东西,我会得到与在创建会话的主页上打印的相同的数组。
这是我认为出现问题的“add_to_cart_handler.php”文件中的一些代码:
$serialized=$_SESSION['user_cart'];
$cartobj=new ShoppingCart();
$cartobj->__unserialize($serialized);
$cartobj->addToCart($new_item_id, 1);
$_SESSION['user_cart']=$cartobj->__serialize();
header('Location: http://localhost/website/heroku/order.php');
这是我的 __serialize() 和 __unserialize() 的 sn-p:
public function __serialize() {
return [
'count'=>$this->count,
'items'=>$this->serialize_items()
];
}
public function __unserialize(array $data) {
$this->count=$data[0];
$this->items=$this->unserialize_items($data[1]);
}
public function serialize_items() {
$serialized=array();
foreach($this->items as $item) {
$serialized[]=$item->__serialize();
}
return $serialized;
}
public function unserialize_items() {
$unserialized=array();
foreach($unserialized as $item){
$tmpItem=new CartItem();
$tmpItem->unserialize($item);
$unserialized[]=$tmpItem;
}
}
其中 unserialize_items() 和 serialize_items() 本质上是相同的,但使用的是 CartItem 对象。
编辑:
值得注意的是,我的 $_SESSION['user_cart'] 的值为 null。
【问题讨论】:
-
另一种方法是使用 array_push(将元素添加到数组)将商品添加到购物车。
-
@KenLee 对,但是推送到数组的内容不会跨页面持久化,并且索引被保留,数据为空
-
一个问题——除了商品之外,是否需要将每件商品的“数量”存入购物车?
-
@KenLee 理想情况下。每个商品的数量实际上并不直接存储在购物车中,而是存储在每个 CartItem 中,因此当用户在多次“添加到购物车”提交后查看他们的购物车时,成本通过商品成本乘以数量来反映,并且公司所有者也将知道每个项目的请求数量。
-
你的
unserialize_items方法没有返回任何东西
标签: php html session session-cookies