我在php中收到了这个警告:
Cannot modify header information - headers already sent by (output started at
当我单独安装mysql,apache和php时,但当我使用Wamp时,警告不存在,并且页面正常重定向。
我已经尝试将错误报告设置为仅显示错误而不是警告,发生的情况是警告没有显示但页面也没有重定向。
我知道这已被认为是不好的做法,但我的代码库有很多这些代码并且修改它们都可能会给代码带来新的错误。 有没有办法在php中完全忽略这个警告?
答案 0 :(得分:3)
避免 - 而不是忽略 - 这个问题的经典方法是使用output buffering,ob_start()和ob_flush()。在任何输出之前启动缓冲,并明确地完成刷新,或者它可以自动完成。这会捕获任何输出而不是打印它,因此输出的任何标题都是在任何可见内容之前完成的。
修复输出内容的错误,从错误消息中的文件名中解决这个问题是解决此问题的最佳方法。在不需要文件时从文件中删除关闭“?>
”可能会有所帮助。
答案 1 :(得分:1)
这是一个可怕的做法,但只是设置
error_reporting(0);
在脚本的开头。否则在php.ini中设置
display_errors = Off
编辑 - 可能您在重定向之前输出了一些内容。我曾经花了三天时间对它进行调试,原因有时是文件末尾的空格,或者是在重定向之前将一些HTML输出到浏览器的事实。
我通常不会关闭php标签以避免这个
答案 2 :(得分:1)
即使您没有显示错误,您的应用程序也无法运行。这是因为像错误一样说标题已经发送。这意味着以下内容: 浏览器在服务器上请求您的php文件。然后服务器执行此操作并发回生成的html。在您发送了php文件的结果后,此错误告诉您正在向浏览器发送内容。所以我建议你尝试修复你得到的错误,而不是仅仅显示错误。
答案 3 :(得分:1)
您无法“忽略”此警告和重定向。警告说得很清楚:
无法发送标头!标题已经按输出发送了!
这意味着标题(Location
标题无法发送,因为输出已经发送。(标题只能在 any和all 输出之前发送。)
请 RTM , 修复您的错误,而不是忽略他们。
错误是由于在调用header()
函数之前发送某种输出引起的,其原因可能是很多事情,当意外时,直接怀疑是开头或结尾的空格一些文件。
<?php //Note the space before the opening tag!
header("Location: this-will-fail.html");
?>
答案 4 :(得分:0)
请注意,此错误确切地指定了代码中您开始向浏览器输出数据的位置(请参阅output started at ...1
,查找尾随空格\ r,\ n,制表符和空格)。
理论上,关闭错误报告不会导致页面重定向,因为标题已经发送,因此无法更改或添加。
如果您需要使用已发送的数据进行重定向,您应该怎么做:
if ( headers_sent() ) // Check if the headers were already sent
{
echo( "<script>document.location.href='$url';</script>" ); // Use client side redirect
die(); // Stop here
}
else
{
header( "Location: $url" ); // Use server side redirect
}
但最好的办法是找出输出的起始位置并确定输出(如果可能的话)。