使用重定向销毁会话
Destroy session with redirect
当我点击注销时 link 它重定向到一个空白页面。
这是 Login.php
文件:
<?php
session_start();
$_SESSION['logout']= 'username';
include_once('config.php');
if(isset($_POST['btn'])) {
$username = addslashes($_POST['username']);
$password = addslashes(md5($_POST['password']));
$query = mysqli_query($connect, "SELECT * FROM register WHERE username = '$username' AND password = '$password' ")
or die(mysql_error());
$result = mysqli_fetch_array($query);
if($result['username']==$username) {
echo "You have successfully loged in <br>";
$check = true;
}else {
echo "Wrong Login or Password <br>";
}
}
?>
<a href="logout.php">Logout</a>
Logout.php
文件:
<?php
session_start();
if(isset($_POST['logout'])) {
session_destroy();
header("Location:login.html");
}
?>
请你更正我的代码并告诉我我做错了什么?
您注销时的这一行
if(isset($_POST['logout'])) {
应该使用 $_SESSION
而不是 $_POST
根据
$_SESSION['logout']= 'username';
您还将 MySQL API 与 or die(mysql_error())
混合,应读作 or die(mysqli_error($connect))
我注意到您正在使用 MD5 存储密码;它很旧,被认为是坏了。
我推荐你使用CRYPT_BLOWFISH or PHP 5.5's password_hash()
function. For PHP < 5.5 use the password_hash() compatibility pack
。
此外,关于 SQL injection which you are open to, use mysqli
with prepared statements, or PDO with prepared statements,它们更安全。
请参阅 ircmaxell 的使用 password_hash()
和 PDO 与准备语句的解决方案:
将 error reporting 添加到文件顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告只能在试运行中进行,绝不能在生产中进行。
问题出在您的 logout.php 文件中,您正在侦听 $_POST。
if(isset($_POST['logout'])) { ...
但是,您只是使用 link 的 href 到注销页面
<a href="logout.php">Logout</a>
这意味着永远不会有 $_POST['logout'] 因为它不是一个表单(而是一个实际的 link)。
因此,由于它是 link,您可以删除 if(isset($_POST['logout'])) { .. 并执行如下操作:
<?php
session_start();
session_destroy();
header("Location:login.html");
?>
当我点击注销时 link 它重定向到一个空白页面。
这是 Login.php
文件:
<?php
session_start();
$_SESSION['logout']= 'username';
include_once('config.php');
if(isset($_POST['btn'])) {
$username = addslashes($_POST['username']);
$password = addslashes(md5($_POST['password']));
$query = mysqli_query($connect, "SELECT * FROM register WHERE username = '$username' AND password = '$password' ")
or die(mysql_error());
$result = mysqli_fetch_array($query);
if($result['username']==$username) {
echo "You have successfully loged in <br>";
$check = true;
}else {
echo "Wrong Login or Password <br>";
}
}
?>
<a href="logout.php">Logout</a>
Logout.php
文件:
<?php
session_start();
if(isset($_POST['logout'])) {
session_destroy();
header("Location:login.html");
}
?>
请你更正我的代码并告诉我我做错了什么?
您注销时的这一行
if(isset($_POST['logout'])) {
应该使用 $_SESSION
而不是 $_POST
根据
$_SESSION['logout']= 'username';
您还将 MySQL API 与 or die(mysql_error())
混合,应读作 or die(mysqli_error($connect))
我注意到您正在使用 MD5 存储密码;它很旧,被认为是坏了。
我推荐你使用CRYPT_BLOWFISH or PHP 5.5's password_hash()
function. For PHP < 5.5 use the password_hash() compatibility pack
。
此外,关于 SQL injection which you are open to, use mysqli
with prepared statements, or PDO with prepared statements,它们更安全。
请参阅 ircmaxell 的使用 password_hash()
和 PDO 与准备语句的解决方案:
将 error reporting 添加到文件顶部,这将有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告只能在试运行中进行,绝不能在生产中进行。
问题出在您的 logout.php 文件中,您正在侦听 $_POST。
if(isset($_POST['logout'])) { ...
但是,您只是使用 link 的 href 到注销页面
<a href="logout.php">Logout</a>
这意味着永远不会有 $_POST['logout'] 因为它不是一个表单(而是一个实际的 link)。
因此,由于它是 link,您可以删除 if(isset($_POST['logout'])) { .. 并执行如下操作:
<?php
session_start();
session_destroy();
header("Location:login.html");
?>