【问题标题】:PHP session looks corruptPHP 会话看起来已损坏
【发布时间】:2011-09-09 21:47:55
【问题描述】:

这用于从会话中获取先前提供的标记列表:

session_start();
if(!isset($_SESSION['markers'])) {
    $_SESSION['markers'] = array(0);
    $list = '0';
} else {
    $list = implode(', ', $_SESSION['markers']);
}

我使用$list 来获取尚未服务的标记:

SELECT * FROM `markers` WHERE {other conditions} AND `marker_id` NOT IN($list) 

然后对于返回的每一行,我将标记 id 添加到会话:

while ($row = mysqli_fetch_assoc($result)){
  $_SESSION['markers'][] = (int) $row['marker_id'];
  ...
}

但是,在提供一些标记(例如 8、36)之后,会话看起来已损坏。 var_dump($_SESSION); 输出:

array(1) {
  ["markers"]=>
  &array(3) {
    [0]=>
    int(0)
    [1]=>
    int(8)
    [2]=>
    int(36)
  }
}

我说它已损坏,因为当我手动创建一个类似的数组 (codepad here) 时,输出在第三行中没有显示& - 它是array(3),而不是&array(3)。这是什么原因造成的?

更新
@Marc B 暗示 会话没有损坏。他的看法是,我们只有一个变量 ($_SESSION),其中包含对数组 ($markers) 的引用,而不是数组本身; 这不是一个损坏的变量。嗯,会话由于会话使用目的而损坏。两个标志:

  1. 对同一个脚本的第二次调用(我猜是采用else 路由)导致fatal errorFatal error: Cannot use object of type DOMElement as array in ... on line 47。第 47 行是我们尝试向数组添加新标记 id 的位置:$_SESSION['markers'][] = (int) $row['marker_id'];
  2. 当我尝试反序列化会话文件的实际内容时,它失败了 (codepad here)。

【问题讨论】:

  • 这不是“损坏” - 只是将该数组转换为对数组的引用。
  • 它看起来像一个数组引用,虽然我不知道为什么会发生这种情况,但我可能会建议尝试在 while 循环中使用 array_push,例如array_push($_SESSION['markers'], (int) $row['marker_id']);
  • @Mark - 所有会话的接触代码如上所示。现在,将数组转换为对它的引用是什么?
  • @Ruslan Kabalin - 我看不出如何解决这个问题,不过我会试一试(出于绝望)。

标签: php session


【解决方案1】:

如果您将 register_globals 设置为 On,则与 $_SESSION 变量关联的全局变量是引用。来源:http://php.net/manual/en/reserved.variables.session.php

【讨论】:

  • +1 谢谢!我检查了 register_globals,令我惊讶的是它是 On(不应该 Off 是 PHP 5.2.* 的默认值吗?)。我会检查关闭它是否可以解决问题。
  • 完美!转动 register_globals 解决了这个问题。
【解决方案2】:

引用自 php 手册 http://php.net/manual/en/reserved.variables.session.php

请注意,如果您将 register_globals 设置为 On,则与 $_SESSION 变量关联的全局变量是引用,因此这可能会导致一些奇怪的情况。

<?php

session_start();

$_SESSION['test'] = 42;
$test = 43;
echo $_SESSION['test'];

?>

加载页面,确定显示 42,重新加载页面...显示 43。

解决方案是在每次执行 session_start() 后执行此操作:

<?php

if (ini_get('register_globals'))
{
    foreach ($_SESSION as $key=>$value)
    {
        if (isset($GLOBALS[$key]))
            unset($GLOBALS[$key]);
    }
}

?>

【讨论】:

    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2023-03-10
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多