在离开页面时销毁PHP会话

在离开页面时销毁PHP会话,php,session,Php,Session,当用户从特定页面离开时,我需要销毁会话。我在页面末尾使用了session\u destroy(),但这对我来说不可行,因为我的页面有分页。我的页面是:abc.php?page=1或abc.php?page=2或abc.php?page=3 因此,当用户从abc.php页面离开时,我需要销毁一个会话。如何在不使用cookie的情况下执行此操作?对于特定页面,您需要销毁会话,然后取消设置all session变量 使用 unset($_会话['varname']) 对于整个站点,您可以使用sessi

当用户从特定页面离开时,我需要销毁会话。我在页面末尾使用了
session\u destroy()
,但这对我来说不可行,因为我的页面有分页。我的页面是:
abc.php?page=1
abc.php?page=2
abc.php?page=3


因此,当用户从
abc.php
页面离开时,我需要销毁一个会话。如何在不使用cookie的情况下执行此操作?

对于特定页面,您需要销毁会话,然后取消设置all session变量 使用

unset($_会话['varname'])


对于整个站点,您可以使用
session_destroy()

要在用户实际离开页面时触发,必须使用Javascript将异步请求发送回服务器。服务器无法神奇地知道用户“留下”了一个页面


请参阅。

当用户导航离开某个页面时,执行某些操作是错误的方法,因为您不知道用户是否将导航到一个完全不同的页面(为了论证,请使用contact.php),或者他/她只会转到abc.php的下一个页面,正如Borelid指出的,没有JS,您无法执行此操作。相反,您可以简单地添加一个检查,看看用户是否来自abc.php:

if (isset($_SESSION['previous'])) {
   if (basename($_SERVER['PHP_SELF']) != $_SESSION['previous']) {
        session_destroy();
        ### or alternatively, you can use this for specific variables:
        ### unset($_SESSION['varname']);
   }
}
首先,在abc.php文件中,在$\u会话数组中设置一个唯一变量,该变量将用作用户已在此页面上的标记:

$_SESSION['previous'] = basename($_SERVER['PHP_SELF']);
然后,在任何输出之前,在所有页面上添加以下内容,以检查用户是否来自abc.php:

if (isset($_SESSION['previous'])) {
   if (basename($_SERVER['PHP_SELF']) != $_SESSION['previous']) {
        session_destroy();
        ### or alternatively, you can use this for specific variables:
        ### unset($_SESSION['varname']);
   }
}
这样,只有当用户来自abc.php且当前页面不同时,您才会销毁会话(或特定变量)


我希望我能够清楚地解释这一点。

我解决了问题。首先获取当前url,然后将页面保持在当前url上。如果页面不在当前url中,则销毁会话

$url = "http" . ((!empty($_SERVER['HTTPS'])) ? "s" : "") . "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$page_name="abc.php";      
if (!preg_match("/$page_name/",$url)) 
 {
  session_destroy();
 } 

但是此代码应该在其他页面上使用。因为http是一个无状态进程,所以无法找到用户何时离开该页面。

用户何时离开该页面,您无法判断,这根本不可能以任何可靠的方式实现

您所能做的就是利用cookies的工作原理。启动会话时,您将向客户端发送一个cookie,该cookie在每次后续访问中标识客户端,从而激活相关会话。由客户在随后的访问中发送此身份证明,由客户“忘记”其身份证明

您可以指示客户端仅发送特定页面的cookie,也可以指示他在关闭浏览器时忘记cookie(生命周期为0)。这可以使用设置


除此之外,您可以简单地忽略页面上不重要的会话参数。当您假定客户机已离开时,您可以在一段时间不活动后删除会话(或会话的某些值)。

Borelid指出了最优雅的解决方案,值得称赞

一个更麻烦的解决方案是在页面上保留一个iframe,该iframe指向另一个设置为每隔几秒钟刷新一次的“监视器”页面。这可以在不使用JavaScript的情况下通过以下方式完成:

<meta http-equiv="refresh" content="10">

我有一个类似的问题,但我的是在一个页面上重新加载我希望我打印的变量被销毁。这是为了我的网页设计类的登录,如果用户输入了错误的用户名或密码,我会进行错误反馈。我可以让错误显示出来,但如果我点击刷新页面,错误就会留在那里。我发现在打印变量后,只需将其设置为nothing,就可以杀死它。看看我做了什么:

<p>To access my website please Login:</p>
<form name='login' action="./PHP_html/PHP/login.php" method='post'>
Username: <input type='text' name='username' /><div><?php print $_SESSION['baduser']; $_SESSION['baduser'] = "";?></div><br />
<div style="padding-left: 4px">Password: <input type='password' name='password' /><div><?php print $_SESSION['badpass']; $_SESSION['badpass'] = "";?></div></div>
<input type='submit' value='Login' /> or you can <a href="./Terms.php">Register</a>
要访问我的网站,请登录:

用户名:
密码: 或者你可以
我不知道这是否有帮助,但它对我起了作用


同时,感谢你们在这样的网站上发表文章,帮助我们这些仍在学习的人

thx bro.可能是重复的,但它是一个asp解决方案。我没有从中得到任何信息……在用户访问我的页面abc.php之前,我如何保持会话的活动状态。当用户离开abc.php时,只需销毁会话。实际上,链接线程中的第一个答案是正确的,而不是特定于asp的。@deceze-正确,是的。实际的解决方案,远非如此。没有兄弟。如果我取消设置或销毁页面末尾的变量,那么我无法在第二或第三个页面abc.php?page=2或3上获取值。因此,我必须使用会话,直到用户离开我的abc.php页面。我该怎么做呢?谢谢兄弟的支持。但是我的页面是为移动用户设计的,所以我不能使用javascript。它只能用php解决吗?Thx兄弟的作品…但是他们有一个问题。如果我不是来自abc.php页面,会话将存储不同的数据。无论如何,非常感谢您的解决方案…如果您希望在会话数组中保留数据,那么您可以使用
unset($_session['varname'])只取消在abc.php上设置的变量,而不是完全销毁它
而不是像Karthik指出的那样,会话销毁()
。对用户不是很友好。如果我在另一个选项卡中打开另一个页面,但仍想同时继续使用
abc.php
,该怎么办?+1老实说,但在页面离开时销毁/取消设置会话变量的想法,而不使用JS,正是从这一缺陷开始产生的。实际上,您只能使用
$\u SERVER['REQUEST\u URI']
因为文件名就在这里。如果所有页面都有一个header.php文件(这是一种常见的做法),您可以简单地使用我的解决方案,而不是在除abc.php之外的所有页面中添加代码。如果您不打算将代码放在
abc.php
上,那么使用该代码是没有意义的。我不知道这与http无状态有什么关系。你仍然面临着与FreekOne的答案相同的问题,会话数据被破坏,即使你不离开
abc.php
。这就是我想去的地方。问题:我该怎么做