根据我的研究,在脚本输出后无法更改标题。 为什么在我编写的代码示例中,脚本在创建新标题之前有几个输出,但一切正常?
<?php
$name = "tommy" ;
?>
<?php
headers_sent($filename, $linenum) ;
header("name: $name") ;
echo "tommy <br>" ;
echo "Headers sent in $filename on line $linenum" ;
?>
此外,输出显示标题是在第0行发送的...如果我之后添加了标题,那怎么可能呢?
答案 0 :(得分:5)
检查php.ini中的输出缓冲是否设置为On。根据php.net上的评论:http://www.php.net/manual/en/ref.outcontrol.php#69059
,某些PHP版本默认情况下也可能是On如果是这样的话,这可能就是为什么你的脚本没有错误就可以正常执行,即使有&#34;输出&#34;在发送标题之前。
编辑:如果您无法访问php.ini文件本身,您可以通过调用ini_get('output_buffering');
来检查PHP脚本中输出缓冲的值。
答案 1 :(得分:2)
在这种情况下,输出意味着向客户端发送信息。可以是echo
,print_r
或其他形式的屏幕输出信息。
有更多输出数据的方法,例如:设置cookie也会发送输出。您无法设置Cookie并继续更改标题。
代码中的错误:
在第3行,您关闭php ?>
并在第5行<?php
打开它。输出第4行,\n
(换行符)。这会引发错误
如果您没有看到该错误,则您的错误级别可能是错误的。你可以在标题上方做一个回音,如果你仍然没有错误,那就是error_reporting。
答案 2 :(得分:1)
使用
{php}文件第一行的ob_start();
答案 3 :(得分:1)
如果我理解你的问题,那么我请你看一下PHP.ini中output_buffering
指令的值。默认值为0,但PHP安装程序通常将其设置为4096(从php.ini-development或php.ini-production复制)。在您的示例中应该是这种情况,即缓冲是开启的。
其次,您的代码示例存在缺陷;它不会检查headers_sent
函数返回的值:
bool headers_sent ([ string &$file [, int &$line ]] )
首先检查返回值;如果返回值为true,则认为文件和行参数有效 :
<?php
$name = "tommy";
?>
<?php
$sent = headers_sent($filename, $linenum);
header("name: $name");
echo "tommy <br>";
if ($sent) {
echo "Headers sent in $filename on line $linenum";
} else {
echo "Headers not sent";
}
?>
输出:
tommy
Headers not sent
总结:
注意:如果output_buffering设置为4096,那么这将起作用:
<?php
echo str_repeat(" ", 4095);
header("X-Foo: Bar");
echo ".";
但是这已经失败,标题已经发送错误:
<?php
echo str_repeat(" ", 4096);
header("X-Foo: Bar");
echo ".";
答案 4 :(得分:0)
// -----------------------
ob_start();
// -----------------------
/* Code here */
// -----------------------
$output = ob_get_clean();
if(ob_get_level() > 0)
ob_end_clean();
echo $output;
// -----------------------
答案 5 :(得分:-1)
确保在您的案例中发送标题之前没有空白符号
<?php
$name = "tommy" ;
?>
<?php
headers_sent($filename, $linenum) ;
header("name: $name") ;
echo "tommy <br>" ;
echo "Headers sent in $filename on line $linenum" ;
?>
在?>
和<?php
之间你有5个可能导致问题的新行字符,如果你将这个文件包含在另一个中,请确保主文件没有任何字符输出高于你的标题命令。