2010-01-30 2 views
1

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

Погрешность я получаю:

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

+0

В чем проблема, которую вы испытываете? –

+0

Что такое проблема с заголовком? Кроме того, я не думаю, что неплохо встраивать вызовы 'ob_start'. – zneak

+0

Пожалуйста, прочитайте этот вопрос о предотвращении внедрения SQL. Это не связано с вашей текущей проблемой, но это очень полезная информация. http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – Kibbee

ответ

3

Я немного озадачен предупреждающим сообщением, которое не включает местоположение кода, вызвавшего отправку первого контента клиенту. Функция 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"); 
} 
+0

на этот раз он не показывает проблему с заголовком nat и перенаправляет на страницу редактирования. Спасибо вам, sir – diEcho

+0

err ... что не должно быть ** исправлено ** ничего. Он просто добавил вывод отладки. Вы не должны принимать мой ответ в этом состоянии как решение вашей проблемы (это действительно не так). Вы абсолютно уверены, что ничего не изменили. Вы проверили страницу так же, как и раньше? – VolkerK

+0

Я просто переписываю код и переписываю все строки, но на этот раз снова получил заголовок, он сосет меня .... – diEcho

4

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

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

+0

Нет места, и нет спецификации UTF-8 (exatcly, я не знаю, что это waht) – diEcho

+0

Тег спецификации спецификации UTF-8 является скрытым символом. Вам нужно будет найти редактор, который вы можете использовать, чтобы показать это (например, Notepad ++). –

+0

(будет +1, но из голосов) пробел и спецификация всегда будут первым, что нужно проверить. –

0

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

+0

, где мне нужно написать 'ob_end_clean()', я уже написал 'ob_end_flush()' в конце скрипта – diEcho

+0

Вы можете полностью изменять заголовки в любой момент перед выполнением вывода (включая формирование буферизованного вывода). – pestilence669

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

+0

нет пробелов, но есть вкладки ans new line, , пожалуйста, скажите мне одну вещь: как сделать отступ кода, показанного вами, без вкладок или новой строки? – diEcho

+0

Я согласен с Скоттом: у вас много ненужных '

+2

Вам нужно использовать вкладки или пробелы для отступов. Вам нужны новые строки для изменения строк. Ключ: Не используйте их вне ваших тегов php. Пробелы внутри тегов PHP игнорируются. Пробелы вне тегов php НЕ игнорируются и выводятся в браузер. Если перед вызовом header() есть пробел вне тегов php, это вызовет ошибку, потому что перед заголовком был выход. В моем примере все новые строки и пробелы находятся внутри тегов php. В вашем коде все они находятся за пределами тегов php. –

0

постановляет ми проблемы с некоторыми пробелами в моем сценарии с 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'); 
?> 

Смежные вопросы