我收到一个php警告:无法修改标题信息(但我在html代码之前有我的包含文件!)

时间:2010-02-27 09:30:03

标签: php warnings

我得到了这个:

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];
}
?>

4 个答案:

答案 0 :(得分:2)

这可能有几个原因:

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

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

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

  3. 您已将文件保存为UTF-8,但 BOM 。保存而无需BOM。

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

答案 1 :(得分:2)

您的l()函数在第一次使用时调用了set_lang(),它设置了一个Cookie - 而Cookie则作为HTTP标头发送。

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

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


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

我会将翻译系统的初始化从l()中删除 - 这意味着在脚本开头“手动”初始化它,是的;但也意味着一个更简单的l()函数,可以减少工作量。

答案 2 :(得分:1)

设置Cookie需要发送标题,因此除非您使用output buffering函数,否则在输出任何页面后都无法调用set_lang()

答案 3 :(得分:0)

尝试将ob_start()函数放在您收到此错误的文件顶部。