与$ _SESSION和对象缓冲的意外交互

时间:2014-12-03 00:02:29

标签: php session output-buffering

编辑:发送标题重定向后我才刚退出。

当回显会话值时,在include文件的输出缓冲区内,如果稍后在脚本中更改了值,则后面的值是回显的值。

我们的网站使用内部框架,其中每个页面都在其自己的文件中,并由index.php包含。索引文件捕获缓冲区中包含文件的输出,并将其存储到变量中。它做了一些其他的事情,然后是回声页眉,页脚和捕获的包含文件。

问题是$_SESSION在执行POST到GET模式时会以意想不到的方式运行:

发布到表单,它会在会话中设置一些内容,然后重定向到另一个页面。在重定向页面上,如果您从会话中回显某些内容,然后在echo语句之后对其进行操作,则最终结果是echo的任何内容都反映了后来的更改。同样适用于unset;从会话中回显一些东西,然后unset,结果就是回声和空字符串。

这是一个基本的例子:

form.php的

if (!empty($_POST['string'])) {
    $_SESSION['message'] = $_POST['string'];
    header("Location: ./index.php?page=formHandler");
    //EDIT - This was not in the original code
    //exit;
} else {
    ?>
    <form action="index.php?page=form" method="post">
        <input type="text" name="string"><input type="submit" />
    </form>
    <?php
}

formHandler.php

if (isset($_SESSION['message'])) {
    echo $_SESSION['message'];
    $_SESSION['message'] = "changed";
}

的index.php

session_start();

ob_start();
include $_GET['page'] . ".php";
$page = ob_get_clean();
echo $page;

那么,会发生什么:

从form.php开始(由索引包含)

输入一个值,发布。

文本"changed"始终显示,即使它是在echo语句之后设置的。

为了举例,这是简化的;标题是由重写触发,而不是获取参数,还有其他一些东西,但这个想法就在那里。

所以我的问题是导致这种意外行为的原因,我该怎么做才能解决这个问题?

使用PHP 5.4

1 个答案:

答案 0 :(得分:0)

更新:我将会出现问题并猜测代码中的某个地方有一个双重重定位,你还没有共享。这将导致浏览器显示“已更改”而不是输入的字符串,因为在页面的第二次加载时,$ _SESSION ['message']已经设置为“已更改”

原始答案:

你的代码是因为它给了我一个$ _POST ['string']未定义的错误所以我改了

if ($_POST['string']) {

在form.php到

if (isset($_POST['string']) {

并且它正常运行,回显我输入表单的字符串。

编辑:我已经测试了没有上面描述的isset,虽然我仍然在index.php?page = form上得到“Undefined index:string”错误,但页面index.php?page = formHandler确实回显了文本进入表格而不是“改变”

在你没有共享的代码中是否还有其他可能导致问题的内容?