【问题标题】:Multidimensional $_SESSION variables not being set before header redirect在标头重定向之前未设置多维 $_SESSION 变量
【发布时间】:2013-02-18 10:11:48
【问题描述】:

我有一个基本的表单提交脚本,它从循环中设置多维 $_SESSION 变量(2 级) - 然后使用标题位置重定向。

我在我的本地机器(运行 PHP 5.3.8 的 xampp/windows 服务器)上开发了这个没有问题,但是我在运行 PHP 5.3.3 的 web linux 服务器上遇到了问题,甚至升级到 5.3.21 也有同样的问题.

这是我的脚本:

if($_POST['submitted']){


    $_SESSION['c'] = array();
    $_SESSION["RETURNING_DISCOUNT"] = array();
    $seq = 1;

    for($d=1; $d<=10; $d++){

        if($_POST["COMPANY_$d"] && $_POST["PHONE_$d"]){

            $_SESSION['c'][$seq] = array();

            $_SESSION['c'][$seq]["COMPANY"] = str_replace("\'", "", str_replace('\"', '', $_POST["COMPANY_$d"]));
            $_SESSION['c'][$seq]["PHONE"] = str_replace("\'", "", str_replace('\"', '', $_POST["PHONE_$d"]));

            if($_POST["COUNTRY_$d"] == 'Canada'){
                $_SESSION['c'][$seq]["STATE"] = str_replace("\'", "", str_replace('\"', '', $_POST["STATE_$d"]));
            }else{
                $_SESSION['c'][$seq]["STATE"] = str_replace("\'", "", str_replace('\"', '', $_POST["STATE_2_$d"]));
            }
            $_SESSION['c'][$seq]["COUNTRY"] = $_POST["COUNTRY_$d"];
            $_SESSION['c'][$seq]["ADDY1"] = str_replace("\'", "", str_replace('\"', '', $_POST["ADDY1_$d"]));
            $_SESSION['c'][$seq]["ADDY2"] = str_replace("\'", "", str_replace('\"', '', $_POST["ADDY2_$d"]));
            $_SESSION['c'][$seq]["CITY"] = str_replace("\'", "", str_replace('\"', '', $_POST["CITY_$d"]));
            $_SESSION['c'][$seq]["ZIP"] = str_replace("\'", "", str_replace('\"', '', $_POST["ZIP_$d"]));
            $_SESSION["RETURNING_DISCOUNT"][$_SESSION['c'][$seq]["COMPANY"]] = $_POST["RETURNING_COMPANY_$d"];

            $seq++;

        }//end declare var in $_SESSION

    }//end for


                header("location: register3.php");



}//end usersubmit

它的设置如下:

[RETURNING_DISCOUNT] => Array
    (
        [working] => 1
    )

[c] => 11

它应该设置什么(如果我禁用标题位置,它会设置)是:

[RETURNING_DISCOUNT] => Array
        (
            [working] => 1
        )

    [c] => Array
        (
            [1] => Array
                (
                    [COMPANY] => jk
                    [PHONE] => jhgk
                    [STATE] => 
                    [COUNTRY] => 
                    [ADDY1] => 
                    [ADDY2] => 
                    [CITY] => 
                    [ZIP] => 
                )

        )

如您所见,问题在于 $_SESSION['c'] 数组。就像我说的那样,当你禁用 header("location: register3.php"); 时它会起作用。几乎就像在正确设置多维数组值之前页面重定向一样。

这可能是输出缓冲问题吗?我的 php.ini 文件中有 output_buffering = off 。我也打开它,看看它是否会有所作为,但没有运气。

对此的任何见解将不胜感激。谢谢。

【问题讨论】:

  • 我没有看到你的session_start() 电话,你是一开始就打电话吗?
  • 你有 session_start() 吗?
  • 是的,很抱歉它超出了我复制的代码,但 session_start() 肯定设置在页面顶部。
  • 对这个sn-p周围的代码一无所知,我建议在最后一次$_SESSION访问之后调用session_write_close()
  • 您的register3.php 是否会意外更改$_SESSION['c']?尝试在调试 $_SESSION 时进行演示。

标签: php session multidimensional-array session-variables output-buffering


【解决方案1】:

请尝试在标头重定向之前打印会话内容,并检查此页面的格式是否正确。

print_r($_SESSION);
exit;

并注释页面上的header重定向行。

【讨论】:

  • 如果我添加 print_r($_SESSION) 代替标头重定向,它的格式正确。我不相信 register3.php 上的任何东西正在改变 $_SESSION 值,但我正在继续调查这种可能性。要么是那个,要么可能是我在想的一个 php 错误?!?
  • 您可以尝试从该页面中删除所有 php 代码,然后使用 session_start();和 print_r($_SESSION);在该页面上还使用 ob_start() 清除缓冲区;就在 session_start() 之上;功能线
【解决方案2】:

路人让我走上了正确的道路。 register3.php 是罪魁祸首。 我仍然不明白相同的代码在两台服务器上的呈现方式有何不同。

这是我所拥有的:

for($c=0; $c<=10; $c++){
    if($_SESSION['c'][$c]){
        $all_co[] = "taco";
    }//end if something is found in array
}//end for

当我将 var $c 更改为 $x 时,一切正常。我很高兴我终于解决了这个问题,但仍然不确定为什么会发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-25
    • 2015-11-21
    • 2021-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多