2010-01-30 127 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我加了ob_end_flush();,但我認爲這不是問題,雖然其他網頁與我上面寫

我正的錯誤相同的腳本運行:

警告:不能更改頭信息 - 在d已經發送了頭: \ xampp \ htdocs \ project \ add_book_hours.php on line 9

+0

您遇到的問題是什麼? – 2010-01-30 18:40:27

+0

什麼是'頭部'問題?另外,我不認爲嵌套'ob_start'調用是一件好事。 – zneak 2010-01-30 18:41:12

+0

請閱讀有關防止SQL注入的問題。這與您目前的問題無關,但它是非常有用的信息。 http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php – Kibbee 2010-01-30 18:43:31

回答

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頭問題,並重定向到編輯頁面。 謝謝先生 – diEcho 2010-01-31 10:57:00

+0

錯誤......不應該有**固定**任何東西。它只是添加了調試輸出。在這個狀態下你不應該接受我的回答作爲解決你的問題的方法(事實並非如此)。你確定你沒有改變別的東西。你有沒有像以前一樣測試_exact的方式? – VolkerK 2010-01-31 11:06:48

+0

我只是重寫代碼並重寫所有行,但是這次我又得到了標題waring,它吸我...... – diEcho 2010-01-31 11:15:41

4

第一個<?php之前是否有空格?

在文件的開頭是否有UTF8-BOM?

+0

沒有空間,也沒有UTF-8 BOM(我不知道這是否是這樣) – diEcho 2010-01-30 19:02:30

+0

UTF-8 BOM標籤是一個隱藏字符。你需要查找一個你可以用來顯示的編輯器(例如Notepad ++)。 – 2010-01-30 19:14:35

+0

(會+1,但票數不足)空白區域和BOM總是首先要檢查。 – 2010-01-30 19:42:30

0

我認爲這個問題可能是因爲在您已經將其他內容發送到輸出後,您正在嘗試更改標題。即使使用緩衝,我也不認爲這是可能的。我想你需要調用ob_end_clean()來放棄當前緩衝區並寫入標題信息。

+0

我必須寫'ob_end_clean()',我已經在腳本的末尾編寫了'ob_end_flush()' – diEcho 2010-01-30 19:06:37

+0

在輸出執行之前(包括緩衝輸出生成),您可以在任何時候完全改變標題。 – pestilence669 2010-01-30 19:56:38

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

有沒有空格,但標籤和新行有, 請告訴我一件事,如何縮進您顯示的代碼,沒有標籤或新行? – diEcho 2010-01-31 08:31:01

+0

我同意Scott的觀點:你有很多不必要的'<?php'打開和關閉塊。嘗試儘可能將所有內容放在一個代碼塊中。 – 2010-01-31 10:57:46

+2

您需要使用製表符或空格來縮進。你需要換行來改變行。關鍵是:不要在你的php標籤之外使用它們。 PHP標籤內的空白被忽略。 php標籤之外的空白不會被忽略並輸出到瀏覽器。如果在調用header()之前在php標記之外存在空格,則會導致錯誤,因爲在標題之前輸出了。在我的例子中,所有的換行符和空格都在php標籤中。在你的代碼中,它們都在php標籤之外。 – 2010-01-31 15:48:41

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