登录/注销会话问题
Login / Logout Session Issue
我现在正在创建某种 login/registration 系统。注册表格、电子邮件确认和登录已经开始工作。我现在的会话有问题。请记住,这个项目只是一个测试项目。我知道我应该使用 PDO,但为了这个测试目的,我需要找出为什么它不能像我那样工作。
这是我的 login.php PHP 代码:
<?php include ('inc/database.php');
if (isset($_POST['submit'])) {
// Initialize a session:
session_start();
$error = array();//this aaray will store all error messages
if (empty($_POST['email'])) {//if the email supplied is empty
$error[] = 'You forgot to enter your Email ';
} else {
if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $_POST['email'])) {
$Email = $_POST['email'];
} else {
$error[] = 'Your EMail Address is invalid ';
}
}
if (empty($_POST['passwort'])) {
$error[] = 'Please Enter Your Password ';
} else {
$Password = $_POST['passwort'];
}
if (empty($error))//if the array is empty , it means no error found
{
$query_check_credentials = "SELECT * FROM user WHERE email='$Email' AND password='$Password' AND activation IS NULL";
$result_check_credentials = mysqli_query($connect, $query_check_credentials);
if(!$result_check_credentials){//If the QUery Failed
echo 'Query Failed ';
}
if (@mysqli_num_rows($result_check_credentials) == 1)//if Query is successfull
{ // A match was made.
$row = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
$_SESSION['email'] = $row["email"];
//Assign the result of this query to SESSION Global Variable
header("Location: index.php");
}else
{ $msg_error= 'Either Your Account is inactive or Email address /Password is Incorrect';
}
} else {
echo '<div> <ol>';
foreach ($error as $key => $values) {
echo ' <li>'.$values.'</li>';
}
echo '</ol></div>';
}
if(isset($msg_error)){
echo '<div>'.$msg_error.' </div>';
}
/// var_dump($error);
} // End of the main Submit conditional.
?>
这是我保护的开始index.php
<?php
ob_start();
session_start();
if(!isset($_SESSION['email'])){
header("Location: login.php");
}
include 'header.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
</head>
.....
我的会话一定有问题,我不知道为什么。使用电子邮件作为会话是错误的吗?我是否将电子邮件用作会话?我还有哪些其他选择?
现在的问题是,如果我点击登录,没有任何反应。我将被重定向到 login.php 而不是 index.php!
有什么建议吗?
努力改变,
$_SESSION = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
至
$results = mysqli_fetch_row($result_check_credentials, MYSQLI_ASSOC);
$_SESSION['email']=$results['email'];
并尝试在登录时检查数据库中的 "activation" 字段是否为空...
正如 Fred -ii- 在上面的评论中提到的,您的 $_SESSION['email']
从未设置,因此您每次都是 re-directed 到您的 login-page。
同样值得注意的是,当使用 header("Location: ...");
时,您可以 not 在 [=56 之前输出 any =]!否则 header 将失败。输出一般是任意 HTML, echo, whitespace (see this SO).
因此,一旦您确定您的 header("Location: index.php");
确实有效,请继续修复您的 $_SESSION
。
$_SESSION = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
不设置 $_SESSION['email']
(如 Fred -ii- 所述)。要解决此问题,您需要从数据库中修复结果。
$row = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
$_SESSION['email'] = $row["email"];
上面的代码将return行"email"从数据库中的结果中,设置为"email"的session,稍后检查时您正在尝试访问 index.php
。
一些 side-pointers(不是你当前的问题,而是一些让你的代码变得更好的技巧)。
- 你应该在使用
header("Location: ...");
(See this SO) 之后使用 exit;
- 您没有对密码进行哈希处理,因此它存储在数据库的 plain-text 中(大 no-no)
- 适当地缩进代码可以使其更易于阅读,进而更容易进行故障排除
如果您执行了上述操作,但仍然无效,我们需要更多信息来帮助进一步排除故障(例如您登录时发生的情况(是否符合预期?),结果如何returned,等等)。
我现在正在创建某种 login/registration 系统。注册表格、电子邮件确认和登录已经开始工作。我现在的会话有问题。请记住,这个项目只是一个测试项目。我知道我应该使用 PDO,但为了这个测试目的,我需要找出为什么它不能像我那样工作。
这是我的 login.php PHP 代码:
<?php include ('inc/database.php');
if (isset($_POST['submit'])) {
// Initialize a session:
session_start();
$error = array();//this aaray will store all error messages
if (empty($_POST['email'])) {//if the email supplied is empty
$error[] = 'You forgot to enter your Email ';
} else {
if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $_POST['email'])) {
$Email = $_POST['email'];
} else {
$error[] = 'Your EMail Address is invalid ';
}
}
if (empty($_POST['passwort'])) {
$error[] = 'Please Enter Your Password ';
} else {
$Password = $_POST['passwort'];
}
if (empty($error))//if the array is empty , it means no error found
{
$query_check_credentials = "SELECT * FROM user WHERE email='$Email' AND password='$Password' AND activation IS NULL";
$result_check_credentials = mysqli_query($connect, $query_check_credentials);
if(!$result_check_credentials){//If the QUery Failed
echo 'Query Failed ';
}
if (@mysqli_num_rows($result_check_credentials) == 1)//if Query is successfull
{ // A match was made.
$row = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
$_SESSION['email'] = $row["email"];
//Assign the result of this query to SESSION Global Variable
header("Location: index.php");
}else
{ $msg_error= 'Either Your Account is inactive or Email address /Password is Incorrect';
}
} else {
echo '<div> <ol>';
foreach ($error as $key => $values) {
echo ' <li>'.$values.'</li>';
}
echo '</ol></div>';
}
if(isset($msg_error)){
echo '<div>'.$msg_error.' </div>';
}
/// var_dump($error);
} // End of the main Submit conditional.
?>
这是我保护的开始index.php
<?php
ob_start();
session_start();
if(!isset($_SESSION['email'])){
header("Location: login.php");
}
include 'header.php';
?>
<!DOCTYPE html>
<html lang="en">
<head>
</head>
.....
我的会话一定有问题,我不知道为什么。使用电子邮件作为会话是错误的吗?我是否将电子邮件用作会话?我还有哪些其他选择?
现在的问题是,如果我点击登录,没有任何反应。我将被重定向到 login.php 而不是 index.php!
有什么建议吗?
努力改变,
$_SESSION = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
至
$results = mysqli_fetch_row($result_check_credentials, MYSQLI_ASSOC);
$_SESSION['email']=$results['email'];
并尝试在登录时检查数据库中的 "activation" 字段是否为空...
正如 Fred -ii- 在上面的评论中提到的,您的 $_SESSION['email']
从未设置,因此您每次都是 re-directed 到您的 login-page。
同样值得注意的是,当使用 header("Location: ...");
时,您可以 not 在 [=56 之前输出 any =]!否则 header 将失败。输出一般是任意 HTML, echo, whitespace (see this SO).
因此,一旦您确定您的 header("Location: index.php");
确实有效,请继续修复您的 $_SESSION
。
$_SESSION = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
不设置 $_SESSION['email']
(如 Fred -ii- 所述)。要解决此问题,您需要从数据库中修复结果。
$row = mysqli_fetch_array($result_check_credentials, MYSQLI_ASSOC);
$_SESSION['email'] = $row["email"];
上面的代码将return行"email"从数据库中的结果中,设置为"email"的session,稍后检查时您正在尝试访问 index.php
。
一些 side-pointers(不是你当前的问题,而是一些让你的代码变得更好的技巧)。
- 你应该在使用
header("Location: ...");
(See this SO) 之后使用 - 您没有对密码进行哈希处理,因此它存储在数据库的 plain-text 中(大 no-no)
- 适当地缩进代码可以使其更易于阅读,进而更容易进行故障排除
exit;
如果您执行了上述操作,但仍然无效,我们需要更多信息来帮助进一步排除故障(例如您登录时发生的情况(是否符合预期?),结果如何returned,等等)。