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

Posted

技术标签:

【中文标题】创建 PHP 会话变量会挂起我的浏览器【英文标题】:Creating a PHP session variable hangs my browser 【发布时间】:2012-03-08 19:25:50 【问题描述】:

我最近才从我的 ASP 洞穴中走出来,无法适应 php 的阳光。

我当前的问题在于一个简单的登录序列,在该序列中我创建了一个会话变量 - 该步骤导致我的浏览器挂起,然后运行不正常。

从我的登录页面 (A.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。后退按钮操作似乎将浏览器置于无限循环中。

这个穴居人做错了什么?

谢谢,

布赖恩。

【问题讨论】:

密码为什么要大写?还是我读错了? 另外:你真的需要在会话中存储密码吗?为什么不使用多维数组为用户数据添加$_SESSION,而是一个字符串(由|分隔)? 无限重定向?浏览器是否有可能在从页面 B 到页面 C 并返回到 B 之间被重定向? C页是做什么的?它是否还包含location 标头? 你使用multiple, long-running requests吗? 【参考方案1】:

我只是在这里猜测。

您需要在您的位置标题后添加一个exit();。如果在重定向后输出更多数据(例如尝试设置 cookie 的会话),则重定向将失败。

给它一个测试,看看会发生什么。

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

【讨论】:

感谢 Leigh,但这两种选择都没有任何区别。我还更改了到此页面的重定向(以防 C.php 出现问题)。重定向很好,但是如果我回到 B.php,系统需要永远连接到页面,然后没有读取任何包含文件,并且页面充满了 PHP 错误通知。莫名其妙! @user1216097:当我对这些事情有疑问时,我通常会去tcpdump

以上是关于创建 PHP 会话变量会挂起我的浏览器的主要内容,如果未能解决你的问题,请参考以下文章

调试 Oracle PL/SQL WEB 应用程序会挂起浏览器和开发工具

从 PHP 执行程序会挂起 APACHE

每当使用异步时,ASP.Net MVC 4 控制器就会挂起

JVM 如何在内部处理竞争条件?

为啥打开 mkfifo 管道时我的程序会挂起?

PySide QtCore.QThreadPool 和 QApplication.quit() 导致挂起?