登录/注销会话问题

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,等等)。