Я получаю предупреждение php: не могу изменить информацию заголовка (но у меня есть файл include перед html-кодом!)

Я получаю это:

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 .

У меня есть common.php перед html-кодом. Я не знаю, в чем проблема. Помогите!

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

Ваша функция l() вызывает set_lang() при первом использовании, который устанавливает cookie – и файлы cookie отправляются как HTTP-заголовки.

Я предполагаю, что по его мнению, l() используется для перевода переведенной версии строки, что означает, что она, вероятно, используется везде в вашем HTML / PHP; т.е. после того, как начался вывод.

Вы должны вызвать set_lang() в верхней части вашего файла common.php – чтобы убедиться, что cookie отправлен до любого содержимого HTML.

На самом деле, в вашем случае, я бы изменил функцию l() так что это только одно: верните переведенную строку.

Я бы поставил инициализацию вашей системы перевода из l() – что означает ее инициализацию «вручную» в начале вашего скрипта, да; но также означает более простую функцию l() которая будет иметь меньше работы.

Это может произойти по нескольким причинам:

  1. Вы отправляете HTTP-заголовки безоговорочно, через setcookie () или session_start ().

    Посмотрите на свою функцию set_lang (). Вы можете исправить это, вызвав l () перед выходом.

  2. У вас есть пробелы перед открытым тегом PHP или тегом тега PHP.

  3. Вы сохранили файл в UTF-8, но с BOM . Сохраните его без спецификации.

Вы всегда можете добавить ob_start (), но это только обойдет проблему.

Настройка cookie требует отправки заголовка, поэтому вы не можете вызвать set_lang() после выхода любой из страниц, если вы не используете функции буферизации вывода .

Попробуйте ob_start() функцию ob_start() в верхней части файла, где вы получаете эту ошибку.