当foreach()虚拟名称与数组名称匹配时,PHP $ _SESSION嵌套数组将丢失

时间:2010-05-25 18:01:24

标签: php

有人可以确认以下是PHP 5.2.13的错误:(谢谢)

<?php
    session_start();
    if (!is_array($_SESSION["breadcrumb"]["trail"]))
    {
        $_SESSION["breadcrumb"]["trail"][] = "trail";
    } 
    foreach ($_SESSION["breadcrumb"]["trail"] as $breadcrumb)
    {
        echo $breadcrumb;
    }
?>

上面的PHP脚本在第3次运行时崩溃了。 foreach()循环似乎有一个(不正确的)副作用,它会消除嵌套的$ _SESSION数组,因为循环中使用的内部变量与嵌套的$ _SESSION数组的名称相匹配。只需将内部foreach()变量的名称更改为不同的名称即可解决问题。

注意:在运行脚本3次之前清除会话变量。

同样,将“$ breadcrumb”更改为“$ the_breadcrumb”可以解决问题。但是foreach()循环应该没有副作用。注意:由于$ breadcrumb的范围与$ _SESSION [“breadcrumb”]的范围不同,因此不应该发生冲突。

请注意,在数组上执行print_r()会将数组显示为第一次(正确)为空,第二次(正确)填充,并错误地设置为“Array([breadcrumb] =&gt; trail)”第三次(嵌套数组已被删除)。

第3次运行的PHP错误日志中的错误: PHP致命错误:不能在第5行使用字符串偏移作为数组

问题不是PHP 5.3上的问题 - 只有PHP 5.2.13。我在PHP网站(php.net)的PHP更新日志中找不到关于此问题的任何注释,我必须在我的实际网站上使用5.2.13,所以我在这里发帖,希望有人可以确认。我还在php.net上发布了一个错误报告。

谢谢, Dan Nissenbaum

预期结果:

第5行没有PHP 5.2.13崩溃。

实际结果:

PHP 5.2.13在第5行崩溃。

3 个答案:

答案 0 :(得分:1)

解决。 notJim指出了register_globals php.ini设置。它被设置为On。按预期,转到关闭以分隔范围。注意:register_globals在PHP 5.3之前已经被弃用(至少可以说是这样) - 可能会更进一步。

答案 1 :(得分:1)

是的,这绝对是一个错误。我将foreach语句中的变量名更改为与会话变量不同的名称,以使两者都正常工作。在php 5.3.0版本中不会出现此问题。

答案 2 :(得分:0)

我使用5.2.6并且打招呼,没有错误。