【问题标题】:PHP headers already sent while redirecting page [duplicate]重定向页面时已发送 PHP 标头 [重复]
【发布时间】:2011-04-24 10:08:46
【问题描述】:

可能重复:
Headers already sent by PHP

你好,当我去那个网站时,它说

Warning: session_register() [function.session-register]: Cannot send session cache limiter - headers already sent (output started at /home/content/49/5712349/html/c/admin/admin.php:17) in /home/content/49/5712349/html/c/admin/admin.php on line 39

Warning: Cannot modify header information - headers already sent by (output started at /home/content/49/5712349/html/c/admin/admin.php:17) in /home/content/49/5712349/html/c/admin/admin.php on line 41

我看到了其他问题,但没有人回答我。

这是代码,非常感谢。

<?php 

if (isset($_SESSION['mattyc-admin'])){
    header ('Location: admin/home.php');
}

if (!isset($_GET['me'])){
    header ('Location: http://www.stat-me.com/mattyc');
}

if ($_GET['me'] != 'mattyc'){
    header ('Location: http://www.stat-me.com/mattyc');
}

?>

<?php

if ($_POST['name'] != "" && $_POST['password'] !="") {

//require "../../scripts/connect_to_mysql.php";

$name = $_POST['name'];
$pass = $_POST['password'];

$name = strip_tags($name);
$pass = strip_tags($pass);
//$name = mysql_real_escape_string($name);
//$pass = mysql_real_escape_string($pass);
$name = eregi_replace("`", "", $name);
$pass = eregi_replace("`", "", $pass);

//$pass = md5($pass);

if ($name == 'mattyc' && $pass == 'qwerty'){
    if (isset ($_SESSION['mattyc-admin'])){
        header ('Location: admin/upload.php');
    }else{
     session_register('mattyc-admin'); 
     $_SESSION['mattyc-admin'] = ('mattyc-adminp');
     header ('Location: admin/upload.php');
    }
}

}
?>

【问题讨论】:

  • 只是一个旁注:session_register 已弃用。
  • 在每个header('Location ...') 之后加上exit 也很好(我假设您不希望在header 之后执行其余代码)
  • 错误信息告诉你一切:“输出开始于/home/content/49/5712349/html/c/admin/admin.php: 17”表示输出在 admin.php 文件的 17 行中生成
  • 每天都会问这个确切的问题。

标签: php html http-headers


【解决方案1】:

在两个 PHP 标记之间有空格。

?>

<?php

这将导致在开始任何会话并发送更多标头之前发送您的标头。

我建议删除那段代码。

【讨论】:

  • 有同样的事情,我的关闭 php 标签 (?> ) 之后有一个空格导致错误。
  • 为什么空格会对编程语言造成如此大的破坏?
【解决方案2】:

问题出在第 16 行和第 18 行之间:

?>

<?php

这将写入一些空格(并发送标题)

【讨论】:

    【解决方案3】:
    ob_clean();
    

    在有问题的代码之前添加上述内容。 Cleans the buffer or something.

    如果您使用 google 搜索它 http://www.google.co.in/search?q=Warning%3A+session_register%28%29+[function.session-register]%3A+Cannot+send+会话+缓存+限制器+-+标头+已经+发送 first result 有这样的解决方案

    确保您已添加 ob_start(); 在网页的第一行和 ob_end_flush();在网页末尾//我在类似的情况下使用过 ob_end_clean() 或 ob_clean()

    更新:

    我被否决了。所以让我澄清一下。

    在有问题的代码中,php 标记之间的空间清晰可见,因此解决方案很简单。但是,如果问题不是那么简单,那么可能是包含文件有问题。如果代码在生成空间或其他输出之前遇到大量重复并且您无法跟踪它怎么办?万一呢?

    如果你在 ob_start() 和 ob_end_clean() 之间封装了你不想输出的东西。不发送输出。 ob_clean() does 类似的东西。

    更新 2 正如 Shrapnel 上校所说

    永远不要犯错误

    解决方法:删除有问题的空间。

    @meagar 更新

    虽然这个问题的答案应该是删除空间,但我发布了一个解决问题的方法,使用 ob_clean() 只是为了赞成票(我讨厌反对票!:))

    <?php
    ob_start(); //started buffering
    ?>
    Hello World and other dangerous texts
    <?php 
    if (isset($_SESSION['mattyc-admin'])){
        header ('Location: admin/home.php');
    }
    
    if (!isset($_GET['me'])){
        header ('Location: http://www.stat-me.com/mattyc');
    }
    
    if ($_GET['me'] != 'mattyc'){
        header ('Location: http://www.stat-me.com/mattyc');
    }
    
    ?>
    
    <?php
    if ($_POST['name'] != "" && $_POST['password'] !="") {
    
    //require "../../scripts/connect_to_mysql.php";
    
    $name = $_POST['name'];
    $pass = $_POST['password'];
    
    $name = strip_tags($name);
    $pass = strip_tags($pass);
    //$name = mysql_real_escape_string($name);
    //$pass = mysql_real_escape_string($pass);
    $name = eregi_replace("`", "", $name);
    $pass = eregi_replace("`", "", $pass);
    
    //$pass = md5($pass);
    ob_clean(); //can use ob_end_clean() too
    if ($name == 'mattyc' && $pass == 'qwerty'){
        if (isset ($_SESSION['mattyc-admin'])){
            header ('Location: admin/upload.php');
        }else{
         session_register('mattyc-admin'); 
         $_SESSION['mattyc-admin'] = ('mattyc-adminp');
         header ('Location: admin/upload.php');
        }
    }
    
    }
    ?>
    

    在我的 php.ini 中将输出缓冲设置为 Off,我测试了上面的代码。只需将 ob_start 添加到页面的开头。 ob_clean() 只需要结束缓冲。如果您确定该页面将不显示任何输出并且仅重定向,则也不需要 ob_clean。 (否则在有问题的代码段之前使用 ob_clean()。) 感谢@meagar 提供的代码和灵感。

    【讨论】:

    • 当您投反对票时,请发表评论。那是约定。
    • 输出缓冲是一个有其用途的工具。不要将其用作掩盖不良设计/简单错误的拐杖。永远不要堵嘴错误。但总是修理它。
    • @Col。弹片谢谢。我完全同意。但它在使用 TCPDF 时节省了我一次机会,它在发送 pdf 标头之前不允许任何输出。
    • 我对您的答案投了反对票,因为它是错误的。添加ob_clean“在有问题的代码之前”不会解决问题,这就是输出缓冲的工作原理。它不会“清理缓冲区或其他东西”。这种语言会混淆你的答案,让你看起来不知道自己在说什么。
    • @meagar 查看我的代表并查看我的个人资料(我是 PHP 初学者)。其实我不知道它到底做了什么。我阅读了手册,并且以前使用过它。这就是我发帖的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2011-08-31
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多