Проблема заголовка PHP с ob_start () и ob_end_flush () - PullRequest
1 голос
/ 30 января 2010

У меня проблема с заголовком, когда я использую ob_start() в начале страницы и ob_end_flush() в конце. Потому что я использую функцию заголовка после выполнения некоторого запроса.

 ob_start();
 include_once("header.php");
 global $db;

 $countstmt="SELECT COUNT(*) FROM tbl_lib_hours dh WHERE book_id IN(SELECT book_id FROM tbl_book WHERE user_id=".$_SESSION['uid'].") ";       
 $delHourExist=$db->query($countstmt);  
 if($delHourExist){
      header("location:edit_delivery_hours.php");
 }
 ....
include_once('footer.php');
ob_end_flush();

В header.php там я также добавил ob_start (); и в footer.php я добавил ob_end_flush ();, но я думаю, что это не проблема, хотя другие страницы работают с тем же сценарием, который я написал выше

Я получаю ошибку:

Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены в D: \ xampp \ htdocs \ project \ add_book_hours.php в строке 9

Ответы [ 5 ]

5 голосов
/ 30 января 2010

Есть ли пробел перед первым <?php?

Есть ли UTF8-BOM в начале файла?

3 голосов
/ 31 января 2010

Я немного сбит с толку, предупреждающее сообщение не включает местоположение кода, который вызвал отправку первого контента клиенту. Функция headers_sent () также может возвращать это местоположение. Итак, для целей отладки попробуйте

<code>if($delHourExist)
{
  if ( headers_sent($path, $lineno) ) {
    echo '<pre>Debug: output started at ', $path, ':', $lineno, "
\ п "; } заголовок ("location: edit_delivery_hours.php"); }
3 голосов
/ 30 января 2010

В вашем коде много невидимого вывода:

<?php ob_start();?> --- THERE IS A LINE RETURN HERE ---
--- SPACES OR TABS ---<?php include_once("header.php"); ?> --- LINE RETURN ---
--- AND HERE ---<?php global $db;
     ...

Выйти из начала и конца ваших php тегов. Просто сделай это:

<?php 
    ob_start();
    include_once("header.php");
    global $db;
    ...

Перед вызовом ob_start () убедитесь, что нет выходных данных и пробелов за пределами ваших тегов. Если ваша ошибка в строке 9, у вас есть куча строк до этого вызова, что может быть проблемой. Возможно, вы захотите опубликовать все эти строки с нумерацией, чтобы мы могли внимательно посмотреть на них.

0 голосов
/ 01 августа 2012

Я решил проблему mi с некоторыми пробелами в моем скрипте с помощью ob_start (); ob_end_flush (); и ob_end_clean (); Чтобы вы могли проверить свой код </p> <pre><code><?php ob_start(); include_once("header.php"); global $db; $countstmt="SELECT COUNT(*) FROM tbl_lib_hours dh WHERE book_id IN(SELECT book_id FROM tbl_book WHERE user_id=".$_SESSION['uid'].")"; $delHourExist=$db->query($countstmt); if($delHourExist) { ob_end_flush(); ob_end_clean(); header("location:edit_delivery_hours.php"); } include_once('footer.php'); ?>

0 голосов
/ 30 января 2010

Я думаю, что проблема может быть в том, что вы пытаетесь изменить заголовки, после того как вы уже отправили что-то еще на выход.Даже при использовании буферизации я не думаю, что это возможно.Я думаю, вам нужно вызвать ob_end_clean (), чтобы отбросить текущий буфер и записать информацию заголовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...