通过标头重定向传递PHP会话变量

时间:2013-06-27 02:18:11

标签: php redirect session-variables

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

  1. 在索引页面上,它会检查$ _SESSION ['log_info']是否设置为'true',如果是,则显示成员的内容。如果为false,则显示登录页面。
  2. 然后,登录后,它会转到login.php,它连接到数据库并检查用户凭据是否匹配等。它将$ _SESSION ['log_info']存储到一系列值,这些值对应于login.php页面上的事件。
  3. 然后重定向到索引页面,该页面读取$ _SESSION ['log_info'](因此知道login.php页面的状态)并对不同的值执行操作。
  4. 我的问题是会话变量没有通过login.php页面上的重定向传递。它们是空的。

    我检查过并且正在运作的事情:

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

    以下是两个页面的代码:

    的index.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>
    

    的login.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();
    }
    
    ?>
    

2 个答案:

答案 0 :(得分:0)

你应该尝试一些事情:

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

    祝你好运!

答案 1 :(得分: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