添加已在$ _SESSION数组中的产品

时间:2015-02-17 16:22:33

标签: php session cart shop

将产品添加到全局数组中我遇到了一个小问题。这可以用在商店购物车中。以下是我们关注的代码部分:

if ( isset($_POST['id']) ){ // If the product is adding to cart. This product Id is sended via form.
            $productid = mysql_real_escape_string($_POST['id']); 
            $cartproduct = mysql_query("select * from stuff where id = '$productid'");
            $Addrow=mysql_fetch_assoc($cartproduct);
            if ($Addrow['qty']<$_POST['qty']){      // the product quantity that will add to cart can't be greater than in database
                $_POST['qty']=$Addrow['qty'];
            }

                $new_product = array(array('name'=>$Addrow['name'], 'id'=>$Addrow['id'], 'price'=>$Addrow['price'], 'qty'=>$_POST['qty'])); // Creating new product info in array
                if (isset($_SESSION['cart'])){ // If the cart exist
                    foreach ($_SESSION['cart'] as $add_product){
                        if ($add_product['id']==$_POST['id']){ // checking that product is already in $_SESSION
                            $exist = TRUE; 
                        }else{
                            $exist = FALSE;
                        }
                    }
                    if ($exist == TRUE){ // If The product is in the $_SESSION: Update amount
                        // I dont have code for it.     
                    }else{ // The product is not in array, add it.
                        $_SESSION["cart"] = array_merge($_SESSION["cart"], $new_product);
                    }
                }else{ // If the cart is not exist
                    $_SESSION['cart']=$new_product;
                }
        }

问题是当我尝试添加已经在数组中的产品时。该功能是将其添加为新产品......

第二个问题是删除这些产品。我不能这样做:

    foreach ($_SESSION['cart'] as $remove){
            if($_GET["id"] == $remove['id']){
                unset($_SESSION["cart"][$remove]);              
            }
        }

任何人都可以帮忙解决它?

1 个答案:

答案 0 :(得分:0)

我建议稍微更改一下这个数组。在“购物车”内,使用产品ID作为产品的钥匙。这样,您就可以轻松地在阵列中查找和更新产品。

您只需更改会话中的购物车数组即可。由于键在数组中是唯一的,因此为键设置值将覆盖前一个键。

所以我添加了一段内部代码的略微修改版本。它执行三个步骤:

  1. 将后置变量添加到常规变量中。我觉得这更容易使用,你可以在继续之前做各种其他检查(比如检查数量是否等于0等)。

  2. 从阵列中获取现有产品或初始化新产品。这使用array_key_exists,因为我认为这是最纯粹的检查,但人们也使用了isset($_SESSION['cart'][$productId]),这也应该有效。无论如何,这样的检查比使用循环更好(更快,更容易),但只有当您切换到使用产品ID作为密钥时它才会起作用。

  3. 只需设置或更新数量,然后将更新的产品写回数组。如果之前存在产品,则只会覆盖之前的值。

  4. 代码变为:

    // Use a variable. It's easier and more readable.
    $productId = $_POST['id'];
    $quantity = $_POST['qty'];
    
    // Your other checks go here. Left out for brevity.
    
    // Get the current product from the cart, if it exists.
    // If not, create a new product.
    if (array_key_exists($productId, $_SESSION['cart'])) {
      // Product found, get it and update its quantity.
      $product = $_SESSION['cart'][$productId];
      $product['qty'] += $quantity;
    } else {
      // Product not found. Initialize a new one.
      $product = array(
            'name' => $Addrow['name'], 
            'id' => $Addrow['id'], 
            'price' => $Addrow['price'],
            'qty' => $quantity);
    }
    
    // Write updated or new product back to the array, and use the product id as key.
    $_SESSION['cart'][$productId] = $product;
    

    其他一些提示:

    • 如果您有机会切换到mysqli或PDO,请不要使用mysql_*函数。不推荐使用mysql函数。
    • 确保检查查询结果。可能出现了问题(或某人伪造了请求),并且无法在数据库中找到产品ID。在这种情况下,$Addrow可能是falsenull。请务必检查并显示相应的错误,而不是更新购物车,否则可能会损坏您的购物车。
    • 如果无法添加数量,我不会默默地降低数量,因为用户会认为他们发现了错误。相反,明确指出这样的数量不可用。
    • 你可能想重新考虑一下。毕竟,今天可能会交付其他库存,或者其他人可能会同时订购最后一件商品。因此,最好在以后检查,订单保存得很好并且您想要处理它。
    • 显示购物车中可用数量的信息,可以让您的竞争对手了解您拥有的库存量,从中可以推断出其他信息。此外,他们甚至可能会下订单,以使您的网站上的产品不可用。这是一个狗吃狗的世界。请注意您显示的信息。