Reputation: 423
I'm currently working on a shopping cart system. It requires a user login to access the cart. So I've wrote some codes to disable access of the cart page if the user is not logged in. However, whenever I try to empty the cart, I get logged out. I just want to destroy the cart session and not the user session. Here's my code:
For the cart page:
<?php
session_start();
if(isset($_SESSION['userID'])){
}
elseif(!isset($_SESSION['userID'])){
echo
"<script>
alert('You must be logged in.');
window.location.href='index.php#login'
</script>";
}
?>
<?php
include ('../import/layout.php');
?>
<body>
<div class="site-wrapper" id="index">
<div class="site-wrapper-inner">
<div class="cover-container">
<?php
include ('../import/nav-two.php');
?>
<!-- <div class="inner cover">
</div>
<div class="mastfoot">
<div class="inner">
<p>© 2015 Aroma Chicken House Restaurant, All Rights Reserved.
<a class="menu-item pull-right" href="#index">Back to Top</a>
</p>
</div>
</div> -->
</div>
<div id="cart">
<div class="container">
<?php
include ('../cart/index.php');
?>
</div>
</div>
</div>
</div>
</body>
For the cart update:
<?php
session_start();
include_once("config/config.php");
//empty cart by distroying current session
if(isset($_GET["emptycart"]) && $_GET["emptycart"]==1)
{
$return_url = base64_decode($_GET["return_url"]); //return url
session_destroy();
header('Location:'.$return_url);
}
//add item in shopping cart
if(isset($_POST["type"]) && $_POST["type"]=='add')
{
$product_code = filter_var($_POST["product_code"], FILTER_SANITIZE_STRING); //product code
$product_qty = filter_var($_POST["product_qty"], FILTER_SANITIZE_NUMBER_INT); //product code
$return_url = base64_decode($_POST["return_url"]); //return url
//MySqli query - get details of item from db using product code
$results = $mysqli->query("SELECT product_name,price FROM products WHERE product_code='$product_code' LIMIT 1");
$obj = $results->fetch_object();
if ($results) { //we have the product info
//prepare array for the session variable
$new_product = array(array('name'=>$obj->product_name, 'code'=>$product_code, 'qty'=>$product_qty, 'price'=>$obj->price));
if(isset($_SESSION["products"])) //if we have the session
{
$found = false; //set found item to false
foreach ($_SESSION["products"] as $cart_itm) //loop through session array
{
if($cart_itm["code"] == $product_code){ //the item exist in array
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$product_qty, 'price'=>$cart_itm["price"]);
$found = true;
}else{
//item doesn't exist in the list, just retrive old info and prepare array for session var
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$cart_itm["qty"], 'price'=>$cart_itm["price"]);
}
}
if($found == false) //we didn't find item in array
{
//add new user item in array
$_SESSION["products"] = array_merge($product, $new_product);
}else{
//found user item in array list, and increased the quantity
$_SESSION["products"] = $product;
}
}else{
//create a new session var if does not exist
$_SESSION["products"] = $new_product;
}
}
//redirect back to original page
header('Location:'.$return_url);
}
//remove item from shopping cart
if(isset($_GET["removep"]) && isset($_GET["return_url"]) && isset($_SESSION["products"]))
{
$product_code = $_GET["removep"]; //get the product code to remove
$return_url = base64_decode($_GET["return_url"]); //get return url
foreach ($_SESSION["products"] as $cart_itm) //loop through session array var
{
if($cart_itm["code"]!=$product_code){ //item does,t exist in the list
$product[] = array('name'=>$cart_itm["name"], 'code'=>$cart_itm["code"], 'qty'=>$cart_itm["qty"], 'price'=>$cart_itm["price"]);
}
//create a new product list for cart
$_SESSION["products"] = $product;
}
//redirect back to original page
header('Location:'.$return_url);
}
?>
Upvotes: 22
Views: 76094
Reputation: 1504
Basically, everyone's answer here is identical, but it's true unset()
function is the only way to pass this scenario. But let me tell you this, unset()
function does not destroy your session but it destroys $_SESSION['key']
variable. Notice I mentioned variable, not session.
So basically unset() function is used to unset a variable.
For example, Try this code.
$greet = 'Hello World!';
unset($greet);
echo $greet;// output will be blank
So in a similar way if you are removing a superglobal variable ($_SESSION is superglobal variable) then you have to pass with a key either it can destroy all sessions. Yes, you can destroy sessions by unset()
function also.
$_SESSION['greet'] = "hello";
$_SESSION['greet2'] = "hello2";
unset($_SESSION['greet']); //only remove $_SESSION variable with key 'greet'
unset($_SESSION); //will destroy the all keys of $_SESSION variable
Although you can use sesion_destroy()
for destroying all keys.
Upvotes: 2
Reputation: 143
use the unset() instead of session_destroy(). where unset point the particular variable, were session_destroy destroy all the session variables.
unset($_SESSION["products"])
Upvotes: 1
Reputation: 143
Specific session's value can be set to "null" and then check that session's value using empty() function where it is needed Or specific session's value can be set to some value let say 0 and then check session's value with set value for performing some operations.
Upvotes: 0
Reputation: 170
session_destroy()
is destroy all session variable and unset(session variable)
destroy a particular session variable.
Upvotes: 2
Reputation:
unset()
func is useful in this case.
session_destroy()
func will destroy
Upvotes: 1
Reputation: 15711
What you want is not to destroy the session, as you want to keep the user logged in. The best way to do that is by removing or overwriting your cart's variables as needed. You can either unset($_SESSION['products']);
remove the variable completely, or $_SESSION['products'] = array();
reset it to an empty cart.
At some point (if you save the cart in database later) you might want to use the same code as you do when removing an item from the cart for all the items present in it...
Upvotes: 4
Reputation: 1776
Use,
unset($_SESSION["products"]);
session_destroy()
will destroy all the sessions, while the above line would destroy a specific session variable.
Upvotes: 6
Reputation: 580
Use unset()
for all the session variables specific to either site 1 or 2.
unset($_SESSION['var1']);
//or
unset($_SESSION['var2']);
Upvotes: 2
Reputation: 2631
What about
unset($_SESSION["products"])
instead of the
session_destroy()
There is only one session per user. So there is no way to destroy a "specific" session. What you can do is delete the contents of your session responsible for the display of the cart (as shown above).
Upvotes: 68