我一直遇到登出后没有被销毁的会话的问题。 (虽然由于某种原因它在IE中完美运行.....但在任何其他浏览器中都没有(Chrome,firefox,opera或safari))
以下是登录授权的代码
<?php
session_start();
$host="localhost"; // Host name
$username="root"; // Mysql username
$password=""; // Mysql password
$db_name="testdatabase"; // Database name
$tbl_name="users"; // Table name
// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
// email and password sent from form
$enteredEmail=$_POST['email'];
$enteredPassword=$_POST['password'];
// To protect MySQL injection (more detail about MySQL injection)
$enteredEmail = stripslashes($enteredEmail);
$enteredPassword = stripslashes($enteredPassword);
$enteredEmail = mysql_real_escape_string($enteredEmail);
$enteredPassword = mysql_real_escape_string($enteredPassword);
$sql="SELECT * FROM $tbl_name WHERE email='$enteredEmail' and password='$enteredPassword'";
$result=mysql_query($sql);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $enteredEmail and $enteredPassword, table row must be 1 row
if($count==1){
// Register $enteredEmail, $enteredPassword and redirect to file "redirect.php"
$_SESSION['email']="email";
header('location:redirect.php');
}
else {
header("location:index.php?error");
}
?>
然后重定向到主页
我将此代码放在标题中以显示用户是否已登录
<?php
if (!isset($_SESSION['email']) || $_SESSION['email'] == ''){
include_once('loggedout.php');
}
else {
include_once('loggedin.php');
}
?>
我还将这两个文件包含在每个页面的顶部:
<?php
if ($_SESSION['email']="email" ) {
session_start();
}
?>
和
<?php
$connect_error= "Sorry, we\'re experiencing connection problems.";
mysql_connect('localhost', 'root', '') or die($connect_error);
mysql_select_db('testdatabase') or die($connect_error);
?>
最后,这是用户在点击退出时进入的注销页面的代码:
<?php
session_start();
session_unset();
session_destroy();
$_SESSION = array();
?>
<html>
<head>
<title>Logged Out</title>
</head>
<body>
<p align="center">You have been successfuly logged out.</p>
<p align="center"><a href="home.php">Go back to homepage.</a></p>
</body>
</html>
然而,在返回主页后,它首先显示为用户已注销,但随后页面的简单重新加载会将用户重新登录。
我尝试了很多不同的会话破坏标记但无论如何,我都遇到了同样的问题。 (是的,我对这整个php的东西比较新,所以非常感谢任何帮助) 有什么想法,以及如何解决它? 提前谢谢!
答案 0 :(得分:0)
// Unset all of the session variables.
$_SESSION = array();
// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Finally, destroy the session.
session_destroy();
答案 1 :(得分:0)
以下是基于观察您当前代码的一些建议:
session_unset();
已弃用,不应与$_SESSION
一起使用 - 摆脱它。setcookie
处理程序删除使用您的域设置的Cookie:session_commit()
之后直接使用session_destroy()
来编写会话数据结束会话。<强>代码:强>
session_start(); // init session vars
if(isset($_COOKIE[session_name()])) {
setcookie(session_name(),'',time()-3600); # unset session id/cookies
}
unset($_SESSION['email']); // this is the key to unsetting your session.
session_destroy(); // destroy session
session_commit(); // commit session write (optional)
代码(替代方案):
// unset session/cookies
$cs = array_keys($_COOKIE);
for ($x=0;$x<count($cs);$x++) setcookie($cs[$x],"",time()-1);
unset($_SESSION['email']); // this is the key to unsetting your session.
session_destroy();
session_commit();
备注:强>
session_destroy()会销毁与之关联的所有数据 本届会议。它不会取消任何全局变量 与会话关联,或取消设置会话cookie。要使用 会话变量,必须调用session_start()。
为了完全杀死会话,喜欢将用户注销掉, 会话ID也必须取消设置。如果使用cookie来传播 会话ID(默认行为),然后会话cookie必须是 删除。 setcookie()可以用于此。
如果使用$ _SESSION(或PHP 4.0.6或更低版本的$ HTTP_SESSION_VARS), 使用unset()取消注册会话变量,即取消设置 ($ _SESSION [&#39; VARNAME&#39;]);
<强>注意:强>
请勿使用unset($ _ SESSION)取消整个$ _SESSION 禁用通过$ _SESSION注册会话变量 超全局。
答案 2 :(得分:0)
感谢所有帮助人员,但我发现了问题。 显然我必须对我的退出文件的网址非常具体。
我将退出链接转到http://domain.com/logout.php
而不是
http://www.domain.com/logout.php
... 捂脸