【问题标题】:I'm getting a php warning: cannot modify header information (but I have my include file before the html code!) [duplicate]我收到一个 php 警告:无法修改标头信息(但我在 html 代码之前有我的包含文件!)[重复]
【发布时间】:2010-02-27 09:30:03
【问题描述】:

我明白了:

Warning: Cannot modify header information - headers already sent by

(输出开始于 /www/zxq.net/a/l/e/alexchen/htdocs/index.php:12) 在 /www/zxq.net/a/l/e/alexchen/htdocs/common.php 在第 13 行

就在我的h2 标签上。

我在 html 代码之前有我的common.php。我不知道问题是什么。救命!

index.php:

<?php
include_once 'common.php';
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"/>
    <title>New Project</title>
    <link rel="stylesheet" type="text/css" href="styles/global.css" />
    <link rel="stylesheet" type="text/css" href="styles/slimbox2.css" />
    <script type="text/javascript" src="scripts/jquery-1.3.2.min.js"></script>
    <script type="text/javascript" src="scripts/jquery.validate.js"></script>
    <script type="text/javascript" src="scripts/slimbox2.js"></script>
    <script type="text/javascript" src="scripts/jquery.scrollTo-min.js"></script>
    <script type="text/javascript" src="scripts/jquery.localscroll-min.js"></script>
    <script type="text/javascript" src="scripts/custom.js"></script>
    <?php if(get_lang()=='en') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-en.js"></script>';} ?>
    <?php if(get_lang()=='es') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-es.js"></script>';} ?>
    <?php if(get_lang()=='tw') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-tw.js"></script>';} ?>
    <?php if(get_lang()=='cn') {echo '<script type="text/javascript" src="scripts/jquery-validate/val-cn.js"></script>';} ?>

common.php:

<?php
session_start();
header('Cache-control: private'); // IE 6 FIX

function get_lang(){
    if(!empty($_GET['lang'])) return $_GET['lang'];
    if(!empty($_SESSION['lang'])) return $_SESSION['lang'];
    if(!empty($_COOKIE['lang'])) return $_COOKIE['lang'];
    return 'en';
}

function set_lang($lang){
    setcookie("lang", $lang, time() + (3600 * 24 * 30));
    $_SESSION['lang'] = $lang;
}

function get_lang_file($lang){
    $lang_file = "languages/lang.$lang.php";
    if(file_exists($lang_file)) return $lang_file;
    if($lang_file = get_lang_file('en')) return $lang_file;
    return false;
}

//translation helper function
function l($string){
    static $translation;

    if(!isset($translation)){
        $lang = get_lang();
        $lang_file = get_lang_file($lang);
        if($lang_file) set_lang($lang);
        $translation = include $lang_file;
    }

    return $translation[$string];
}
?>

【问题讨论】:

标签: php warnings


【解决方案1】:

您的 l() 函数在第一次使用时调用 set_lang(),这会设置一个 cookie -- 并且 cookie 作为 HTTP 标头发送。

我猜,从外观上看,l() 用于获取字符串的翻译版本——这意味着它可能在您的 HTML/PHP 中的任何地方都使用过;即在开始发送输出之后。

您应该在common.php 文件的顶部调用set_lang()——以确保在发送任何 HTML 内容之前发送 cookie。


事实上,在你的情况下,我会修改 l() 函数,所以它只做一件事:返回翻译后的字符串。

我会把你的翻译系统的初始化放在l()之外——这意味着在你的脚本开始时“手动”初始化它,是的;但也意味着一个更简单的 l() 函数要做的工作更少。

【讨论】:

  • @Pascal MARTIN,感谢您的回复。我将其更改为:
  • 从这里看,你似乎在index.php的开头声明了你的函数,这是一回事;;但你没有打电话给set_lang()“手动”;;这意味着这仍然是对l() 的第一次调用,这将导致set_lang() 被调用,并被发送cookie;;您应该从 index.php 文件的开头调用 set_lang(),因此 cookie 在任何输出之前发送。
  • janoChen 您可以在 session_start() 之后立即使用空字符串调用 l(),因此它将设置标题。如前所述,另一种可能性是使用 ob_start()。再看看我的回答。
  • @Pascal MARTIN,你能给我一个你刚才建议的代码示例吗?
  • @janoChen :在包含include_once 'common.php'; 的行之后尝试调用set_lang(get_lang()); 之类的东西,以便立即发送cookie - 或者按照@Sagi 在他的评论中建议的那样做,这应该得到结果相同。
【解决方案2】:

这可能有几个原因:

  1. 您通过 setcookie() 或 session_start() 间接发送 HTTP 标头。

    看看你的 set_lang() 函数。您可以通过在输出前调用 l() 来修复它。

  2. 您在 PHP 打开标记之前或 PHP 关闭标记之后有 空格

  3. 您将文件保存为 UTF-8,但使用 BOM。在没有 BOM 的情况下保存它。

您可以随时添加 ob_start(),但这只会绕过问题。

【讨论】:

    【解决方案3】:

    设置 cookie 需要发送标头,因此一旦输出任何页面,您就无法调用 set_lang(),除非您使用 output buffering 函数。

    【讨论】:

      【解决方案4】:

      尝试将ob_start() 函数放在出现此错误的文件顶部。

      【讨论】:

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