编辑:发送标题重定向后我才刚退出。
当回显会话值时,在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
答案 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确实回显了文本进入表格而不是“改变”
在你没有共享的代码中是否还有其他可能导致问题的内容?