更新购物车功能添加新项目而不是更新现有项目



当用户单击"添加到购物车"时,将发出ajax请求并将商品添加到购物车中。检索产品 ID,然后从数据库中提取所需的详细信息并将其放入购物车会话数组中。这一切都很好用。

public function AddToCart()
{
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$quantity = 1;
$prod_id = $_POST['prod_id'];
$prod_data = $this->ProductFendModel->GetProductByIdCart($prod_id);
$data = [
'prod_name' => $prod_data->prod_name,
'sale_price' => $prod_data->sale_price,
'sp_name' => $prod_data->sp_name    
];
$response = array();
$message = '';    
$key = "{$prod_id}";
if (empty($_SESSION['cart_array'][$key])) {
$_SESSION['cart_array'][$key] = array(
'prod_id' => $prod_id,
'quantity' => $quantity,
'prod_name' => $data['prod_name'],
'sale_price' => $data['sale_price'],
'sp_name' => $data['sp_name']
);
}
else {
$_SESSION['cart_array'][$key]['quantity'] += $quantity;
}
$response['success'] = true;
$response['message'] = 'Product added to cart';
echo json_encode($response);
}
}

但是,当我尝试更新购物车时,它会使用正确的数量复制现有项目,而不仅仅是更新购物车中已有的数量。例如,如果我的购物车中有 2 件商品,我现在得到 4 件。前 2 个具有原始数量,新添加的 2 个具有正确的数量。

public function UpdateCart()
{
if($_SERVER['REQUEST_METHOD'] == 'POST') {
foreach($_POST['prod_id'] as $key => $id)
{
$qty = $_POST['quantity'][$key];
$_SESSION['cart_array'][$key]['quantity'] = $qty;
}
}
}

我看到的一件事是在 UpdateCart 中,您正在访问 $_POST['prod_id'] 作为关联数组,但在 AddToCart 中作为整数。foreach($_POST['prod_id'] as $key => $id)$prod_id = $_POST['prod_id'];. 另外,在生产中使用它之前,不要忘记过滤您的 POST 变量!这确实是一种很好的做法,即使您只是将数据写入会话,甚至可以允许您按类型进行清理,以便您可以更加确定在运行时拥有该控制权。

如果这不能为您指明正确的方向,您可以考虑发布 _SESSION 美元和 _POST 美元的转储。此外,如果您还没有这样做,请使用 PHPUnit。即使有最好的使用方法,它也使用起来并不复杂。

至于请求变量,您可以将数组传递给函数或您的类,而不是直接从函数内部访问状态变量。这样做可以防止逻辑过于复杂,并允许您将应用程序设计的较大部分保留在短期工作记忆中。

最新更新