【问题标题】:Is there a different method to store an array into a session variables without duplicates?是否有不同的方法可以将数组存储到会话变量中而不重复?
【发布时间】:2019-05-05 17:45:28
【问题描述】:

我正在尝试开发一个存在于会话中的购物车,购物车不能有任何重复项,因此需要添加的每个项目都是唯一的,否则它只会警告用户它已被添加。

我通过合并一个数组和一个 if 语句来检查它是否已经存在于该变量中,逻辑似乎仍然允许重复并由于某种原因在某个点停止。


//We search for the product that has been clicked on
    $sql = $conn->prepare('SELECT * FROM product WHERE product_id= :product_id');
    $sql -> execute(['product_id' => $product_id]); //execute the statement
    $row = $sql->fetch();

    $product_name = $row['product_name'];
    $product_id = $row['product_id'];
    $product_price = $row['product_price'];

    //You could perform another search here to obtain the product image

    $cartArray = array(
        $product_id=>array(
        'product_name'=>$product_name,
        'product_id'=>$product_id,
        'product_price'=>$product_price,
        'product_quantity'=>1
        )
    );

    // we perform some logic that detects if the product is already in the basket.
    // If it is, we display an error message. Increasing quantity is handled on the cart page
    if(empty($_SESSION["shopping_cart"])) {
        $_SESSION["shopping_cart"] = $cartArray;
        $status = "<div class='box'>Product is added to your cart!</div>";
    }else{
        $array_keys = array_keys($_SESSION["shopping_cart"]);

        if(in_array($product_id,$array_keys)) {
        $status = "<div class='box' style='color:red;'>
        Product is already added to your cart!</div>";

        } else {
        $_SESSION["shopping_cart"] = array_merge(
        $_SESSION["shopping_cart"],
        $cartArray
        );
        $status = "<div class='box'>Product is added to your cart!</div>";


    }

}
}


I would like to know if there was anything that I need to do differently to prevent duplication

【问题讨论】:

  • 您的逻辑似乎有效,但可以缩短和简化。你能分享一下允许复制的案例吗?你遇到过吗?

标签: php arrays session


【解决方案1】:

我建议这样做:

//We search for the product that has been clicked on
$sql = $conn->prepare('SELECT * FROM product WHERE product_id= :product_id');
$sql -> execute(['product_id' => $product_id]); //execute the statement
$row = $sql->fetch();   

// Collect from $row just what must be in cart session
foreach ( $row as $index => $value ) {
    if ( in_array( $index, $cartDesign ) ) {
        $product[ $index ] = $value;
    }
}

// Store session in Array
$currentCart = $_SESSION[ 'shopping_cart' ];

// Product properties. Quantity comes after.
$cartDesign = array(
    'product_id',
    'product_name',
    'product_id',
    'product_price',
);

// Checks if products is already in the cart
$inCart = false;
foreach ( $currentCart as $index => $cartItem ) {
    if ( $cartItem[ 'product_id' ] === $product[ 'product_id' ] ) {
        $inCart = true;
        $indexInCart = $index;
    }
}

if( $inCart ) {
    // One more in quantity of prodduct (if desired). Comment it if the product just can be or not be in the cart
    $_SESSION["shopping_cart"][ $indexInCart ][ "quantity" ] = $currentCart[ "shopping_cart" ][ $indexInCart ] + 1;
    // Send status: product is already there
    $status = "<div class='box' style='color:red;'>Product is already added to your cart!</div>";
} else {
    // Send status: product was not there
    $status = "<div class='box'>Product is added to your cart!</div>";
    $array_keys = array_keys($_SESSION["shopping_cart"]);

    // Adding to cart in session
    $appendToCart = array( $product, "quantity" => 1 );
    $_SESSION[ "shopping_cart" ][] = $appendToCart;
}

这种方式需要会话设计$_SESSION[ "shopping_cart" ][ int $index ][ array $product ],$_SESSION[ "shopping_cart" ][ int $index ][ "quantity" ][ int $quantity ]

【讨论】:

  • 有更好的方法来编写您发布的代码,并且添加数量是在不同页面中照顾的状态......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多