【问题标题】:Cannot modify header information Warning message in PHP? [duplicate]无法修改 PHP 中的标头信息警告消息? [复制]
【发布时间】:2010-07-29 08:10:19
【问题描述】:

我的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 开始)发送

【问题讨论】:

  • 您在打开
  • 如果设置了 BOM,则它是文件开头的两个字符,由编辑器(记事本?)设置但通常不显示。当您使用“另存为”保存文件时,您为“编码”提供了哪些选项?
  • 您的脚本不包含任何 UTF-8 字符,因此只需选择 ANSI
  • 嗯,很奇怪。答案正是我所说的?我是第一个回答的?

标签: php http-headers warnings


【解决方案1】:

确保&lt;?php 之前没有空格(包括 BOM 或换行符)

【讨论】:

  • 不,没有任何空白。BOM 是什么意思?
【解决方案2】:

引用 BOM 的 Wikipedia 条目:

字节顺序标记

许多 Windows 程序(包括 Windows 记事本)添加字节 0xEF, 0xBB, 0xBF 在任何开头 保存为 UTF-8 的文档。这是 Unicode 字节的 UTF-8 编码 订单标记 (BOM),通常是 被称为 UTF-8 BOM,即使 它与字节顺序无关。这 BOM 也可以出现,如果另一个 带有 BOM 的编码被转换为 UTF-8 不剥离它。

UTF-8 BOM 的存在可能会导致与 可以处理 UTF-8 的现有软件,例如:

+ 较旧的文本编辑器可能会在文档开头将 BOM 显示为“”,即使 UTF-8 文件仅包含 ASCII 并且会正确显示。
+ 编程语言解析器通常可以处理字符串常量和 cmets 中的 UTF-8,但无法解析文件开头的 BOM。

【讨论】:

    【解决方案3】:

    还要确保在此之前运行的任何代码在单独的文件中可能同时具有&lt;?php-opening 和?&gt;-closure。

    如果在 te ?&gt;-关闭标记之后使用空格运行脚本(例如,因为愚蠢的编辑器在那里放置了行尾)PHP 将开始在那里发送输出。

    只需在文件末尾省略任何 ?>。如果 PHP 到达一个文件的末尾,并且它没有 ?>,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);
    

    没有结束?>

    【讨论】:

      【解决方案4】:

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

      像这样:

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

      祝你好运;)

      【讨论】:

        【解决方案5】:

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

        1) 找到 header() 语句 导致问题。错误必须是 在此行或之前。

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

        3) 确保没有空格 在 php 开始和结束标记之外。 而&lt;?php 之前的空行 开始标签可能看起来很无辜,当 由PHP处理,它会变成一个 echo 语句打印出一个空白 线。这是一个常见的罪魁祸首。

        【讨论】:

        • 错误消息在 index.php 的第 1 行准确地说明了输出的生成位置。这是
        【解决方案6】:

        您可能在开头之前有一个空格

               <?php
        

        标签

        【讨论】:

          【解决方案7】:

          好吧,我还有其他不错的解决方案。

          <?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 (Output Buffering)。启动 OB 后,不会再出现警告消息。 另一个需要注意的重点是页面的第一行和第一列必须是 5 个字符的 PHP 开始标记 (&lt;?php)。之后没有任何空白字符,按回车键,并为函数“ob_start()”提供分号。之后,您可以随心所欲地写作,而不必担心收到那条歪曲的警告信息。

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

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2018-06-24
            • 2011-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-15
            • 1970-01-01
            • 2013-07-09
            相关资源
            最近更新 更多