1

我正在为我所在的机器人团队编写 PHP 登录系统。登录系统的流程如下。

  1. 在索引页面上,它检查 $_SESSION['log_info'] 是否设置为 'true',如果是,则显示成员的内容。如果它是假的,它会显示一个登录页面。
  2. 然后,登录后,它转到连接到数据库的 login.php 并检查用户凭据是否匹配等。它将 $_SESSION['log_info'] 存储到与 login.php 页面上的事件相对应的一系列值。
  3. 然后它重定向到读取 $_SESSION['log_info'] 的索引页面(因此知道 login.php 页面的状态)并对不同的值执行操作。

我的问题是会话变量没有通过 login.php 页面上的重定向传递。它们是空的。

我检查过并且有效的事情:

  • 我已经检查过它们是否正在设置,并且它们是。(我可以在 login.php 页面上回显它们。)
  • 我也知道重定向有效,因为我可以更改标题语句的位置,并且一切正常。
  • 我也知道 PHP 会话 cookie 在整个过程中保持不变,所以也不是这样。
  • 我有 session_start(); 在我所有的页面上。

这是两个页面的代码:

索引.php

<?php // this is first line of page
session_start();

// If user is not logged in, sets $log_info == 'false'
if (!isset($_SESSION['log_info']) || $_SESSION['log_info'] == '' || $_SESSION['log_info'] == '0') { $_SESSION['log_info'] = 'false'; }

function get_banner() {
  // Switch statement for all cases of $log_info... Usually displays banner to user...
  switch ($_SESSION['log_info']) {
    case 'true':
      echo '<div class="banner">You are logged in!</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'false':
      echo '<div class="banner">Please login below.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'error':
      echo '<div class="banner">Your username or password do not match.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'acc_fail_username':
      echo '<div class="banner"><b>Account creation failed:</b><br/>Your selected username already exists. Please pick a different one.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'acc_fail_parm':
      echo '<div class="banner"><b>Account creation failed:</b><br/>One or more of your entry fields were invalid. Please try again.</div>';
      $_SESSION['log_info'] = '';
      break;

    case 'acc_success':
      echo '<div class="banner">Your account was successfully created! Login below.</div>';
      $_SESSION['log_info'] = '';
      break;

    default:
      $_SESSION['log_info'] = '';
      //die('Something went wrong internally. Please stay calm while we fix it');
  }
}

?>

<?php get_banner(); ?>

<b>Login:</b>

<form action="login.php" method="post">
Username: <input type="text" name="username"><br/>
Password: <input type="password" name="password"><br/>
<input type="submit">
</form>

登录.php

<?php // this is first line of page
session_start();

// Connect and verify connection
$con = @mysqli_connect($host, $username, $password, $dbname);

$username = $_POST['username'];
$password = $_POST['password'];

$query = mysqli_query($con, "SELECT * FROM FRC4096users WHERE     username='".$username."'");
$row = mysqli_fetch_array($query);

$salt = $row['salt'];

if ($row['passwordhash'] === hash('sha512', $password . $salt)) {
  $salt = hash('sha512', rand());
  mysqli_query($con, "UPDATE users SET salt='". $salt ."' WHERE     username='".$username."'");  // Resets salt on login for security
  mysqli_query($con, "UPDATE users SET passwordhash='". hash('sha512', $password .     $salt) ."' WHERE username='".$username."'");  // Resets salt on login for security
  $_SESSION['log_info'] = 'true';
  session_write_close();
  header('Location: /');
  die();
} else {
  $_SESSION['log_info'] = 'error';
  session_write_close();
  header('Location: /');
  die();
}

?>
4

2 回答 2

0

你应该尝试几件事:

  1. 检查所有域是否相同。当您更改域时,会话会发生变化。
  2. 查看存储会话的临时文件夹。尝试监视以查看是否有东西从文件中擦除数据。
  3. 在您的项目文件中搜索您session_destroy()可能不知道的任何内容。
  4. 从您的文件中删除session_write_close(),因为这会在解析结束时自动执行并且您的脚本很短。
  5. 尝试error_reporting(E_ALL);在开始会话之前使用更改错误报告级别。
  6. 也许print_r($_SESSION)所有页面中的一个可以帮助您找到数据的去向。

这可以帮助您检测错误在哪里。

祝你好运!

于 2013-06-27T02:28:51.977 回答
0

如果你这样做了怎么办......

<?php // this is first line of page
  session_start();

  if (!isset($_SESSION['log_info']){  header('Location: /login.php');die();} 
  else {

 switch ($_SESSION['log_info']) {
  case 'true': echo '<div class="banner">You are logged in!</div>';
    unset($_SESSION['log_info']);
    break;

  case 'false':
    echo '<div class="banner">Please login below.</div>';
    unset($_SESSION['log_info']);
    break;

case 'error':
  echo '<div class="banner">Your username or password do not match.</div>';
  unset($_SESSION['log_info']);
  break;

case 'acc_fail_username':
  echo '<div class="banner"><b>Account creation failed:</b><br/>Your selected username already exists. Please pick a different one.</div>';
  $_SESSION['log_info'] = '';
  break;

case 'acc_fail_parm':
  echo '<div class="banner"><b>Account creation failed:</b><br/>One or more of your entry fields were invalid. Please try again.</div>';
  unset($_SESSION['log_info']);
  break;

case 'acc_success':
  echo '<div class="banner">Your account was successfully created! Login below.</div>';
  unset($_SESSION['log_info']);
  break;

default:
  unset($_SESSION['log_info']);
  break;
  }
}
?>


 <b>Login:</b>

 <form action="login.php" method="post">
 Username: <input type="text" name="username"><br/>
 Password: <input type="password" name="password"><br/>
 <input type="submit">
 </form>

然后在您的登录页面上,有这个......在顶部......其余是一样的......

<?php // this is first line of page
   session_start();
   session_unset();
 //rest of code
于 2013-06-27T02:32:07.637 回答