我有一些代码可以将商品添加到购物车并在重新添加商品时更新其数量。它还能够将其他项目添加到购物车,但问题是当任何不是数组中第一项的项目被重新添加时,它会生成该项目的另一个数组而不是更新原始项目中的数量数组。
if(isset($_SESSION['cart']) && is_array($_SESSION['cart'])){
//update quantity if already in cart
if(array_key_exists($form_data['listing_id'], $_SESSION['cart'])){
$_SESSION['cart']['quantity'] += $form_data['quantity'];
//add listing if not in cart
}else {
$new_item = array('listing_id' => $form_data['listing_id'],
'name' => $form_data['name'], 'slug' => $form_data['slug'],
'image_url' => $form_data['image_main'], 'price' =>
$form_data['price'], 'quantity' => $form_data['quantity']);
array_push($_SESSION['cart'], $new_item);
}
}else {
//add listing to empty cart
$_SESSION['cart'] = array('listing_id' => $form_data['listing_id'],
'name' => $form_data['name'], 'slug' => $form_data['slug'],
'image_url' => $form_data['image_main'], 'price' =>
$form_data['price'], 'quantity' => $form_data['quantity']);
}
我也试过下面的代码无济于事。
if(array_key_exists($form_data['listing_id'], $_SESSION['cart'])){
$_SESSION['cart']['quantity'] += $form_data['quantity'];
//add listing if not in cart
}
假设你的会话数组:
你应该创建一个具有以下结构的查找数组:
$_SESSION['cart'][**item id**] = [
**item details**,
...
];
在验证用户操作合法地提交了有效的产品 ID 和数量(以及任何其他可自定义的数据)之后,将该有效负载应用于会话数组。
我不知道
listingModel
的 getListingById()
到底做了什么,但它应该有希望返回一个有效负载,它可能包含剩余的库存量。如果用户订购了太多东西,您需要向他们发出信号,表明库存不足以满足他们的订单。
一旦用户操作得到验证和清理,就可以将数据推送/添加到会话中了。
请注意,尊重用户的
name
、slug
、price
等是没有意义的,因为用户不值得信赖。这些值只能从您的数据库中提取。
如果在会话数组中找到项目,则仅增加数量。
否则,如果数组为空或已填充,操作是相同的——只需将新数据推入数组。如果您使用方括号语法,则无需在推送之前声明父数组。
$listingId = $form_data['id'];
$listing = $this->listingModel->getListingById($listingId); // reurn null or a populated row as an object
if (!$listing) {
exit('Sorry, not sorry hacker');
}
// a potentially irrelevant condition if supply is no concern: if insufficient stock ($listing->quantity < $form_data['quantity']), return with notification
if (isset($_SESSION['cart'][$listingId])) {
//update quantity of existing listing
$_SESSION['cart'][$listingId]['quantity'] += $form_data['quantity'];
} else {
// push listing into cart
$_SESSION['cart'][$listingId] = [
'id' => $listingId,
'name' => $listing->name,
'slug' => $listing->slug,
'image_main' => $listing->image_main,
'price' => $listing->price,
'quantity' => (int) $form_data['quantity']
];
}
//check for listing in db
$listing = $this -> listingModel -> getListingById($form_data['id']);
if(!$listing){
die('No listing');
}
if($listing == $_SESSION['cart']['form_id']){
//update quantity if already in cart
$_SESSION['cart']['quantity'] += $form_data['quantity'];
}else {
//add listing if not in cart
$_SESSION['cart'][$form_data['id']] = ['id' =>
$form_data['id'], 'name' => $listing -> name, 'slug' => $listing ->
slug, 'image_main' => $listing -> image_main, 'price' => $listing ->
price, 'quantity' => $form_data['quantity']];
}
redirect('cart');