标题已经发送了?...在​​哪里?

时间:2013-01-15 06:27:24

标签: php http-headers output-buffering

  

可能重复:
  Headers already sent by PHP

我在日志文件中不断收到此错误:

[15-Jan-2013 00:50:04] PHP Warning:  Cannot modify header information - headers already sent by (output started at /home/usr/public_html/display.php:1) in /home/usr/public_html/display.php on line 17

所以我看一下第一行的页面,我看不到任何可能发送标题的页面。

Display.php的:

<?PHP
require './err/errhandler.php';
require './assets/display.php';
require './assets/excrate.php';

$mysql_host = "sqlhost";
$mysql_database = "db";
$mysql_user = "user";
$mysql_password = "password";

$name = $_REQUEST["q"];
$type = $_GET["s"];
$timeperiod = $_POST["tp"];
$currency = $_POST["c"];

if(isset($currency)){
    setcookie("prefCur", $currency, time()+60*60*24*30*12, "/");
    $_COOKIE["prefCur"] = $currency;
} else {
    if(!isset($_COOKIE["prefCur"])){
        setcookie("prefCur", "usd", time()+60*60*24*30*12, "/");
        $_COOKIE["prefCur"] = "usd";
    }
}
...

errhandler.php:

<?PHP
ini_set('display_errors', false);
ini_set('log_errors', true);
ini_set('error_log', dirname(__FILE__) . '/_err.log');
ini_set('output_buffering', 'on');

Display.php的:

<?PHP
function strip_name($name)
{
    return preg_replace('/\s\([a-zA-Z 0-9]*\)/', '', preg_replace('/[0-9%]+\s/', '', str_replace(":", "", str_replace("-H", "-h", $name))));
}

excrate.php:

<?PHP $eur = 0.747807; $gbp = 0.621828; $rub = 30.227148;

然后我想知道是不是我的主机附加了一个php文件,所以将我的htaccess更改为:

php_value auto_prepend_file none
php_value auto_append_file none
Options +FollowSymLinks
...

我仍然得到错误声称已经发送了标头。我现在很难过。标题在第一行发送到哪里?我甚至无法启用输出缓冲,因为它位于第一行!

编辑:<?PHP之前绝对没有,即使输出缓冲打开,它也不起作用。它只是从第17行转移到第18行。

3 个答案:

答案 0 :(得分:0)

简单地将此代码写在文件顶部

ob_start();

答案 1 :(得分:0)

删除对setcookie()的调用并检查输出。只是抛出输出缓冲并不总是最好的选择。如果您包含的任何文件输出任何内容或您调用的任何函数抛出任何警告/通知,则构成标题设置。

再次移除setcookie()并从那里开始。从外面诊断任何进一步的猜测都是猜测。 :)

答案 2 :(得分:0)

由于OP声明他的要求没有结束标记,因此在每个要求的末尾添加?>