创建PHP会话变量会挂起我的浏览器


Creating a PHP session variable hangs my browser

我最近才从ASP洞穴中出来,很难适应PHP的阳光。

我目前的问题在于一个简单的登录序列,在这个序列中我创建了一个会话变量——这一步骤会导致我的浏览器挂起,然后出现不稳定的行为。

从我的登录页面(A.php),登录表单被引导到B.php(下面),B.php处理密码,创建会话变量,然后将用户重定向到另一个文件(C.php)。

为了简洁起见,我只是假设登录成功。B.php包含以下内容:

<?php
session_start();
require "../scripts/base/toolbox.php";
fnProcessLogin();
function fnProcessLogin(){
    $passwd = strtoupper($_POST["passwd"]);
    if (strlen($passwd)==0)
    {
    $passwd=strtoupper($_SESSION['plpassword']);
    unset($_SESSION['plpassword']);
  } 
  try{
    $db = Database::getDB();
    $sql="SELECT securitylevel, staffID, staffname, stafflname, staffemail, iRoleID FROM staff WHERE staffpasswd=?;";
    $data = array($passwd);
    $query = $db->prepare($sql);
    $query->execute($data);
    if($query->rowCount()>0){
      $row = $query->fetch();
      $a=$passwd."|".$row['staffID']."|".$row['staffname']."|".$row['stafflname']."|".$row['staffemail']."|".$row['iRoleID'];
      $_SESSION['admin'] = $a;
      header('Location: C.php');
    }
 } 
  catch(PDOException $pe){
    echo "We are sorry, but we cannot complete this database operation.";
    file_put_contents('PDOerrors.txt',$pe->getMessage(),FILE_APPEND);
  }
} 
?>

如果我注释掉"$_SESSION['admin']=$a;"行,重定向工作正常,但一旦我尝试创建该会话变量,我的浏览器就会挂起,直到最终转到C.php,它无法正确加载任何文件。后退按钮操作似乎将浏览器置于一个无休止的循环中。

这个洞穴人做错了什么?

谢谢,

布莱恩。

我只是在猜测。

您需要在您的位置标头后面有一个exit();。如果在重定向后输出了更多的数据(比如会话试图设置cookie),重定向将失败。

测试一下,看看会发生什么。

您也可以在会话分配后尝试session_write_close(),以强制在尝试重定向之前完成所有与会话相关的数据。不过,我仍然强烈推荐exit();