重定向页面时已经发送了PHP标头

时间:2010-10-12 16:08:38

标签: php html http-headers

  

可能重复:
  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');
    }
}

}
?>

3 个答案:

答案 0 :(得分:18)

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

?>

<?php

这会导致在开始任何会话和发送更多标题之前发送标题。

我建议删除那段代码。

答案 1 :(得分:8)

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

?>

<?php

这会写一些空格(和发送标题)

答案 2 :(得分:1)

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 正如科普拉普尔说的那样

  

从不唠叨错误

Soultion:移除有问题的空间。

@meagar的更新

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

<?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的代码和灵感。