简体   繁体   中英

Is there a different method to store an array into a session variables without duplicates?

I am trying to develop a shopping cart that lives in a session, the shopping cant has any duplicates so every item that needs to be added is unique otherwise it would just warn the user that it is already added.

I am doing this through merging an array and an if statement where it would check if it already exists in that variable, the logic seems to still allow duplicates and stops at a certain point for some reason.


//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

I suggest this:

//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;
}

This way requires the session design $_SESSION[ "shopping_cart" ][ int $index ][ array $product ] , $_SESSION[ "shopping_cart" ][ int $index ][ "quantity" ][ int $quantity ]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM