Benedict Payot
Benedict Payot

Reputation: 423

How do I destroy a specific session variable in PHP?

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>&copy; 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

Answers (10)

DEEPAK
DEEPAK

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

navjot singh
navjot singh

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

Aasim
Aasim

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

Hacker
Hacker

Reputation: 170

session_destroy() is destroy all session variable and unset(session variable) destroy a particular session variable.

Upvotes: 2

user4868160
user4868160

Reputation:

unset() func is useful in this case.

session_destroy() func will destroy

Upvotes: 1

Salketer
Salketer

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

Venkata Krishna
Venkata Krishna

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

Naved Munshi
Naved Munshi

Reputation: 507

you can use

  unset($_SESSION["products"]);

Upvotes: 5

Tanjima Tani
Tanjima Tani

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

Markus M&#252;ller
Markus M&#252;ller

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

Related Questions