如何销毁 PHP 中的特定会话变量?

How do I destroy a specific session variable in PHP?

我目前正在研究购物车系统。它需要用户登录才能访问购物车。所以我写了一些代码来禁止用户未登录时访问购物车页面。但是,每当我尝试清空购物车时,我都会被注销。我只想销毁购物车会话而不是用户会话。这是我的代码:

对于购物车页面:

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

对于购物车更新:

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

unset($_SESSION["products"])

而不是

session_destroy()

每个用户只有一个会话。所以没有办法销毁 "specific" 会话。您可以做的是删除负责显示购物车的会话内容(如上所示)。

对特定于站点 1 或 2 的所有会话变量使用 unset()

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

你可以使用

  unset($_SESSION["products"]);

使用,

unset($_SESSION["products"]);

session_destroy() 将销毁所有会话,而上面的行将销毁特定的会话变量。

您不想破坏会话,因为您想让用户保持登录状态。最好的方法是根据需要删除或覆盖购物车的变量。您可以 unset($_SESSION['products']); 完全删除变量,或者 $_SESSION['products'] = array(); 将其重置为空购物车。

在某些时候(如果您稍后将购物车保存在数据库中),您可能希望使用与从购物车中删除商品时为其中存在的所有商品使用相同的代码...

unset() func 在这种情况下很有用。

session_destroy() func 会破坏

session_destroy() 销毁所有会话变量,unset(session variable) 销毁特定会话变量。

可以将特定会话的值设置为 "null",然后在需要时使用 empty() 函数检查该会话的值,或者可以将特定会话的值设置为某个值,比如 0,然后检查会话的值具有执行某些操作的设置值。

使用 unset() 而不是 session_destroy()。其中 unset 指向特定变量,session_destroy 销毁所有会话变量。

unset($_SESSION["products"])

基本上大家在这里的回答都是一样的,但确实unset()函数是通过这个场景的唯一途径。但是让我告诉你,unset() 函数不会破坏你的会话,但它会破坏 $_SESSION['key'] 变量。请注意,我提到的是变量,而不是会话。

So basically unset() function is used to unset a variable.

例如,试试这个代码。

   $greet = 'Hello World!';
   unset($greet);
   echo $greet;// output will be blank

因此,以类似的方式,如果您要删除超全局变量($_SESSION 是超全局变量),那么您必须传递一个密钥,否则它会破坏所有会话。是的,您也可以通过 unset() 函数销毁会话。

$_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

尽管您可以使用 sesion_destroy() 来销毁所有密钥。