无法在PHP中修改标题信息警告消息?

时间:2010-07-29 08:10:19

标签: php http-headers warnings

我的index.php网页代码是 -

<?php

if(!$_COOKIE['authorized'] == 1) {
header("Location: login.php");
}

?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org   /TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My Photo Website</title>
<script src="js/jquery-1.2.6.pack.js" type="text/javascript"></script>
<script src="js/jquery.lightbox-0.5.pack.js" type="text/javascript"></script>
<script src="js/myscript.js" type="text/javascript"></script>
<link rel="stylesheet" href="css/default.css" />
<link rel="stylesheet" href="css/jquery.lightbox-0.5.css" />


</head>
<body>
<form method="post" action="changePhotoTitle.php">
<div id="container">
<h1>My Photos <small>click on the text to change the title.</small></h1>
<a href="login.php?logout=1" id="logout">logout</a>

<div id="main">

<?php require 'getPhotos.php'; ?>

<div id="response" class="hidden" />
</div><!-- end main-->

</div><!-- end container-->
</form>
</body>
</html>

我的database.php页面代码是 -

<?php

$db_name = "db";
$db_server = "localhost";
$db_user = "root";
$db_pass = "";

$mysqli = new MySQLi($db_server, $db_user, $db_pass, $db_name) or die(mysqli_error());

?>

但随后的警告信息即将来临 - 警告:无法修改标头信息 - 已在第4行的C:\ xampp \ htdocs \ pics \ index.php中发送的标头(输出从C:\ xampp \ htdocs \ pics \ index.php:1开始)< /强>

7 个答案:

答案 0 :(得分:5)

确保<?php

之前没有空格(包括BOM或换行符)

答案 1 :(得分:4)

从维基百科条目中引用BOM:

  

字节顺序标记

     

许多Windows程序(包括   Windows Notepad)添加字节0xEF,   任何开头的0xBB,0xBF   文件保存为UTF-8。这是   Unicode字节的UTF-8编码   订单标记(BOM),通常是   尽管如此称为UTF-8 BOM   它与字节顺序无关。该   BOM也可以出现另一个   带有BOM的编码被翻译成   UTF-8没有剥离它。

     

UTF-8 BOM的存在可能会导致互操作性问题   现有的软件,否则可以处理UTF-8,例如:

     

+ 旧版本的文本编辑器可能会在文档开头显示“ï»”,即使UTF-8文件只包含ASCII,否则会正确显示。
   + 编程语言解析器通常可以在字符串常量和注释中处理UTF-8,但无法解析文件开头的BOM。

答案 2 :(得分:1)

另外,请确保在单独的文件中运行的任何代码都可能同时包含<?php - 开放和?> - 关闭。

如果在te ?>之后运行带有空格的脚本 - 结束标记(例如,由于那些将行结尾放在那里的愚蠢的编辑器),PHP将开始在那里发送输出。

简单地省略任何?&gt;在文件的末尾。如果PHP到达文件的末尾,并且它没有?&gt ;,那么PHP将在那里结束PHPmode。这是一个记录的PHP功能。

因此,您可以按如下方式重写database.php

<?php

$db_name = "db";
$db_server = "localhost";
$db_user = "root";
$db_pass = "";

$mysqli = new MySQLi($db_server, $db_user, $db_pass, $db_name) or die(mysqli_error());

没有结束?&gt;

答案 3 :(得分:0)

您是否尝试删除文件顶部的所有空格?

像这样:

<?php
if(!$_COOKIE['authorized'] == 1) {
header("Location: login.php");
} ?>
祝你好运;)

答案 4 :(得分:0)

google中的小搜索: http://www.tech-recipes.com/rx/1489/solve-php-error-cannot-modify-header-information-headers-already-sent/

  

1)找到 header()语句   造成这个问题。错误必须是   在此行或之前。

     

2)寻找可能的任何陈述   在此之前将输出发送给用户   标题声明。如果你找到一个或   更多,找到一些移动标题的方法   他们面前的陈述。复杂   条件陈述可能会复杂化   问题,但他们也可能有所帮助   解决这个问题。考虑一下   顶部的条件表达式   确定的PHP脚本   标头值尽早和   把它放在那里。

     

3)确保没有空白区域   在php开始和结束标记之外。   <?php之前的空白行   开始标记可能看起来无辜,何时   由PHP处理,它将变成一个   echo语句打印出一个空白   线。这是一个常见的罪魁祸首。

答案 5 :(得分:0)

您可能在

之前的开头有空格
       <?php

标签

答案 6 :(得分:0)

我还有其他一些不错的解决方案。

<?php
ob_start();

if(!$_COOKIE['authorized'] == 1) {
    header("Location: login.php");
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org   /TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<!-- Rest of the code follows here -->

主要问题是您尚未启动OB(输出缓冲)。启动OB后,不会再出现警告消息。 需要注意的另一个重点是第一排&amp;页面的第一列必须是5个字符的PHP开始标记(<?php)。之后没有任何空白字符,按Enter键,并以分号提供“ob_start()”函数。在那之后无论你想要什么,你都可以写作,而不必担心会收到那些歪曲的警告信息。

同样在整个代码的末尾,您可以调用此PHP函数“ob_end_flush()”来刷新整个输出缓冲区。但是,如果不使用此函数,代码也可以工作,因为默认情况下,PHP会在网页处理结束时输出输出缓冲区的所有内容。

希望它有所帮助。