Проблема с заголовком PHP с ob_start() и ob_end_flush()

Я получаю проблему с заголовком, в то время как я использую 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();, но я думаю, что это не проблема, хотя другие страницы работают с тем же script, что я пишу выше

Ошибка, которую я получаю:

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

Ответы

Ответ 1

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

if($delHourExist)
{
  if ( headers_sent($path, $lineno) ) {
    echo '<pre>Debug: output started at ', $path, ':', $lineno, "</pre>\n";
  }
  header("location: edit_delivery_hours.php");
}

Ответ 2

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

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

Ответ 3

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

<?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, у вас есть куча строк до этого вызова, что может быть проблемой. Вы можете опубликовать все эти строки, пронумерованные, чтобы мы могли внимательно их рассмотреть.

Ответ 4

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

Ответ 5

Я разрешаю проблему mi с некоторыми пробелами в моем script с ob_start(); ob_end_flush(); и ob_end_clean(); Таким образом, вы можете проверить свой код

<?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');
?>

код >