在 php5.3 > php5.5.9 升级后,访问 php class 对象中的会话变量失败
Accessing a session variables in a php class object fails after php5.3 > php5.5.9 upgrade
对象和会话属性不会从 class 函数返回到启动脚本中,即使 classes 和对象启动。我可以从 class 函数中使用 var_dump() 查看它们的属性,但它们不会在 class 函数之外返回。
我有一个全局包含的文件 global.inc.php,它在每个页面上都会被调用,它会做很多事情。在用户表单登录上,包含调用自定义 class ('UserTools.class.php') 使用:
$userTools = new UserTools();
这个 class 做了 3 件事:
- 数据库检查用户(一些密码 verification/hashing 稍后出现 - 此处省略):
public function login($username, $password)
{
$result = mysql_query("SELECT * FROM users WHERE username = '$username'");
$row = mysql_fetch_assoc($result);
- 设置一堆 $_SESSION 变量(session_start() 已经从 global.inc.php 调用)
$_SESSION["login_time"] = time();
$_SESSION["logged_in"] = true;
$_SESSION["passwordHash"] = $passwordHash;
- 初始化用户class并将用户对象序列化到会话变量$_SESSION['user']:
$_SESSION["user"] = serialize(new User($row));
如果我 var_dump($_SESSION['user']) 从 "within" 到 class,我可以看到用户对象的序列化字符串表示:
var_dump($_SESSION['user']):
array (size=4)
'SESS_PARENT' => boolean true
'SESS_CHILD' => boolean true
'timezone' => int 300
'user' => string 'O:4:"User":13: {s:2:"id";s:1:"1";s:8:"username";s:5:"peter";s:14:"hashedPassword";s:60:"y.....(length=6160)
问题
但是当class函数returns调用global.in.php脚本时,完整的$_SESSION变量是:
array (size=0) .
empty
Q1。我在这里做错了什么?
Q2。自 php 5.3 以来发生了什么变化才能产生这种效果?
Session_start()
罪魁祸首原来是 $_SESSION 超全局和一组复杂的包含。
session_start();
不在包含文件的开头,只是在一些 ini_set 命令为 $_SESSION 超全局设置各种参数之后的某个地方。
Header 重定向
Header 重定向未保存 session 数据。
这是因为,对 $_SESSION 变量的任何更改都是在脚本结束时进行的。使用 exit()
语句的 header 重定向本质上是中断脚本的执行 - 因此 session 需要写回磁盘、数据库或 Redis 'before' redirect 和 exit() 命令被调用。
对象和会话属性不会从 class 函数返回到启动脚本中,即使 classes 和对象启动。我可以从 class 函数中使用 var_dump() 查看它们的属性,但它们不会在 class 函数之外返回。
我有一个全局包含的文件 global.inc.php,它在每个页面上都会被调用,它会做很多事情。在用户表单登录上,包含调用自定义 class ('UserTools.class.php') 使用:
$userTools = new UserTools();
这个 class 做了 3 件事:
- 数据库检查用户(一些密码 verification/hashing 稍后出现 - 此处省略):
public function login($username, $password) {
$result = mysql_query("SELECT * FROM users WHERE username = '$username'");
$row = mysql_fetch_assoc($result);
- 设置一堆 $_SESSION 变量(session_start() 已经从 global.inc.php 调用)
$_SESSION["login_time"] = time();
$_SESSION["logged_in"] = true;
$_SESSION["passwordHash"] = $passwordHash;
- 初始化用户class并将用户对象序列化到会话变量$_SESSION['user']:
$_SESSION["user"] = serialize(new User($row));
如果我 var_dump($_SESSION['user']) 从 "within" 到 class,我可以看到用户对象的序列化字符串表示:
var_dump($_SESSION['user']):
array (size=4)
'SESS_PARENT' => boolean true
'SESS_CHILD' => boolean true
'timezone' => int 300
'user' => string 'O:4:"User":13: {s:2:"id";s:1:"1";s:8:"username";s:5:"peter";s:14:"hashedPassword";s:60:"y.....(length=6160)
问题
但是当class函数returns调用global.in.php脚本时,完整的$_SESSION变量是:
array (size=0) . empty
Q1。我在这里做错了什么?
Q2。自 php 5.3 以来发生了什么变化才能产生这种效果?
Session_start()
罪魁祸首原来是 $_SESSION 超全局和一组复杂的包含。
session_start();
不在包含文件的开头,只是在一些 ini_set 命令为 $_SESSION 超全局设置各种参数之后的某个地方。
Header 重定向
Header 重定向未保存 session 数据。
这是因为,对 $_SESSION 变量的任何更改都是在脚本结束时进行的。使用 exit()
语句的 header 重定向本质上是中断脚本的执行 - 因此 session 需要写回磁盘、数据库或 Redis 'before' redirect 和 exit() 命令被调用。