How do I destroy a specific session variable in PHP?

血红的双手。 提交于 2020-08-19 06:02:46

问题


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);
}
?>

回答1:


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).




回答2:


you can use

  unset($_SESSION["products"]);



回答3:


Use,

unset($_SESSION["products"]);

session_destroy() will destroy all the sessions, while the above line would destroy a specific session variable.




回答4:


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




回答5:


Use unset() for all the session variables specific to either site 1 or 2.

unset($_SESSION['var1']);
//or
unset($_SESSION['var2']);



回答6:


unset() func is useful in this case.

session_destroy() func will destroy




回答7:


use the unset() instead of session_destroy(). where unset point the particular variable, were session_destroy destroy all the session variables.

unset($_SESSION["products"])



回答8:


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




回答9:


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.




回答10:


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.



来源:https://stackoverflow.com/questions/28602173/how-do-i-destroy-a-specific-session-variable-in-php

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!