php - 为什么每次尝试向数组中添加内容时都会覆盖当前数据?
问题描述
我目前正在尝试使用 PHP 处理网站的购物车对象。我有跨多个网页持久存在的购物车对象。
每当我向购物车添加东西时,我首先检查该对象是否存在,如果它不存在,我会将它添加到项目数组中,但如果它确实存在,我将简单地更新数量现有项目。
然而,这种情况并非如此。每当我尝试向购物车添加东西时,我的程序都无法识别出购物车中已经有一个对象。此外,如果购物车中没有东西,它会将其添加到购物车中,但是它会删除其中已经存在的内容并添加然后替换。
您可以在下面找到我检查它是否存在并添加它的代码:
public function obj_exists($item_id){
for($i=0;$i<$this->count;$i++){
if($this->items[$i]->getID()==(int)$item_id){
return $i;
}
}
return -1;
}
public function addToCart($item_id, $quantity){
$existing=$this->obj_exists($item_id);
echo $existing;
if(is_numeric($item_id) && is_numeric($quantity) && $quantity>=1){
if($existing==-1){
$newItem=new CartItem();
$newItem->setQuant($quantity);
$newItem->setID($item_id);
$this->items[]=$newItem;
$this->count++;
} else {
$this->items[$existing]->increment();
}
} else if (is_numeric($item_id) && is_numeric($quantity)) {
echo "Invalid quantity";
}
}
这是我在我的 cart_handler.php 中调用 addToCart 方法的地方:
$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');
exit();
以防万一有人问,这是我的序列化和反序列化方法:
public function serialize_items() {
$serialized=array();
foreach($this->items as $item) {
$serialized[]=$item->__serialize();
}
return $serialized;
}
public function __serialize() {
return [
'count'=>$this->count,
'items'=>$this->serialize_items()
];
}
public function unserialize_items(array $data) {
$unserialized=array();
foreach($data as $item){
$tmpItem=new CartItem();
$tmpItem->unserialize($item);
$unserialized[]=$tmpItem;
}
return $unserialized;
}
public function __unserialize(array $data) {
$this->count=$data[0];
if(!is_null($data[1])){
$this->items=$this->unserialize_items($data[1]);
}
}
解决方案
推荐阅读
- c# - Web api 和 Mvc Razor 中的 Dotnet Core 错误处理
- .net - 如何让我的机器人向给定的电子邮件地址发送电子邮件?
- c# - 如何根据键盘和鼠标活动更改图像?
- java - 是否可以将图像加载库与 odoo 移动框架一起使用
- c# - 使用 CultureInfo.InvariantCulture 时不排除 DateTime
- clojure - Clojure:具有不同数量的递归匿名函数
- google-bigquery - BigQuery 动态查询 - 相当于 SQL Server sp_executesql
- c# - C# - 如何使用 try-catch 块处理此代码中的错误?
- postgresql - 在 PostgreSQL 中创建管理员用户
- python - postgres pg8000 创建数据库