我目前正在开发购物车系统。它需要用户登录才能访问购物车。因此,如果用户未登录,我已经编写了一些代码来禁止访问购物车页面。但是,每当我尝试清空购物车时,我都会被注销。我只想破坏购物车会话而不是用户会话。这是我的代码:
购物车页面:
<?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>© 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);
}
?>
答案 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()
销毁所有密钥。