【问题标题】:How do I destroy a specific session variable in PHP?如何销毁 PHP 中的特定会话变量?
【发布时间】:2015-02-19 09:01:50
【问题描述】:

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

对于购物车页面:

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

【问题讨论】:

标签: php session


【解决方案1】:

怎么样

unset($_SESSION["products"])

而不是

session_destroy()

每个用户只有一个会话。所以没有办法破坏“特定”会话。您可以做的是删除负责显示购物车的会话内容(如上所示)。

【讨论】:

  • 男人。谢谢!不敢相信事情就这么简单。我试图弄清楚有一段时间了。感谢您为我节省了一些时间。
【解决方案2】:

你可以使用

  unset($_SESSION["products"]);

【讨论】:

    【解决方案3】:

    使用,

    unset($_SESSION["products"]);
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          session_destroy()func 会销毁

          【讨论】:

            【解决方案7】:

            使用 unset() 代替 session_destroy()。在 unset 指向特定变量的地方,session_destroy 会破坏所有会话变量。

            unset($_SESSION["products"])
            

            【讨论】:

              【解决方案8】:

              基本上,这里每个人的答案都是相同的,但确实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() 销毁所有密钥。

              【讨论】:

              • 扩展了所有其他答案 - 正是我需要的。谢谢
              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 2011-10-07
                  • 2015-05-12
                  • 2018-01-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-03-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-05-25
                  相关资源
                  最近更新 更多