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

时间:2015-02-19 09:01:50

标签: php session

我目前正在开发购物车系统。它需要用户登录才能访问购物车。因此,如果用户未登录,我已经编写了一些代码来禁止访问购物车页面。但是,每当我尝试清空购物车时,我都会被注销。我只想破坏购物车会话而不是用户会话。这是我的代码:

购物车页面:

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

10 个答案:

答案 0 :(得分:30)

怎么样?
unset($_SESSION["products"])

而不是

session_destroy()

每个用户只有一个会话。因此,没有办法摧毁特定的&#34;会话。您可以做的是删除负责显示购物车的会话内容(如上所示)。

答案 1 :(得分:3)

你可以使用

  unset($_SESSION["products"]);

答案 2 :(得分:3)

使用,

unset($_SESSION["products"]);

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

在这种情况下,

unset() func非常有用。

session_destroy() func将销毁

答案 6 :(得分:0)

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

答案 7 :(得分:0)

特定会话的值可以设置为&#34; null&#34;然后在需要的地方使用empty()函数检查该会话的值或者可以将特定会话的值设置为某个值,假设为0,然后使用设置值检查会话的值以进行执行一些操作。

答案 8 :(得分:0)

使用unset()代替session_destroy()。 session_destroy销毁了所有的会话变量。

intent.putExtra(FIRST_LAUNCH, true)
startActivity(intent)

答案 9 :(得分:0)

基本上,每个人在这里的答案都是相同的,但确实unset()函数是通过此方案的唯一方法。但是,让我告诉您,unset()函数不会破坏您的会话,但会破坏$_SESSION['key']变量。注意,我提到的是变量,而不是会话。

因此,基本上,unset()函数用于取消设置变量。

例如,尝试以下代码。

   $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()销毁所有密钥。