【发布时间】: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) 的引用,而不是数组本身; 这不是一个损坏的变量。嗯,会话由于会话使用目的而损坏。两个标志:
- 对同一个脚本的第二次调用(我猜是采用
else路由)导致fatal error:Fatal error: Cannot use object of type DOMElement as array in ... on line 47。第 47 行是我们尝试向数组添加新标记 id 的位置:$_SESSION['markers'][] = (int) $row['marker_id']; - 当我尝试反序列化会话文件的实际内容时,它失败了 (codepad here)。
【问题讨论】:
-
这不是“损坏” - 只是将该数组转换为对数组的引用。
-
它看起来像一个数组引用,虽然我不知道为什么会发生这种情况,但我可能会建议尝试在 while 循环中使用 array_push,例如array_push($_SESSION['markers'], (int) $row['marker_id']);
-
@Mark - 所有会话的接触代码如上所示。现在,将数组转换为对它的引用是什么?
-
@Ruslan Kabalin - 我看不出如何解决这个问题,不过我会试一试(出于绝望)。