Проблема заголовка 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 ();, но я думаю, что это не проблема, хотя другие страницы работают с тем же сценарием, который я написал выше
Ошибка, которую я получаю:
Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены в D:\xampp\htdocs\project\add_book_hours.php в строке 9
5 ответов
Я немного сбит с толку, предупреждающее сообщение не включает местоположение кода, который вызвал отправку первого контента клиенту. Функция 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");
}
Есть ли место до первого <?php
?
Есть ли UTF8-BOM в начале файла?
В вашем коде много невидимого вывода:
<?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, у вас есть куча строк перед этим вызовом, что может быть проблемой. Возможно, вы захотите опубликовать все эти строки с нумерацией, чтобы мы могли внимательно посмотреть на них.
Я думаю, что проблема может быть в том, что вы пытаетесь изменить заголовки, после того как вы уже отправили что-то еще на вывод. Даже при использовании буферизации я не думаю, что это возможно. Я думаю, что вам нужно вызвать ob_end_clean(), чтобы сбросить текущий буфер и записать информацию заголовка.
Я решаю проблему с некоторыми пробелами в моем скрипте с помощью 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');
?>