2011-01-26 50 views
2

我在我正在建設的網站上有註冊表單。如果填寫正確,我希望用戶回到主頁面。如何在表單完成後在php中重定向到另一頁?

我試圖使用header,但我得到「無法修改標題信息...」我想這是因爲我發佈到$_SERVER['PHP_SELF'];

有關如何在表單正常時重定向用戶的建議? (除了帶按鈕的成功頁面)

+0

如果你在屏幕上打印任何東西 - 任何東西 - 你都不能使用`header`。必須在任何輸出之前調用`header`,如果你向我們展示你的代碼,也許我們可以弄清楚什麼是錯誤的;即使你在第一個`<?php`前面有一個空格,它可能會導致這個問題。 – 2011-01-26 00:17:38

回答

7

如果web服務器沒有向用戶瀏覽器輸出其他文本/字符串數據,則只能使用header()函數。

你需要任何事情之前把邏輯重定向在你的腳本的頂部:

<?php 

// Process form 

// If processing was successful, redirect 
if($success) 
{ 
    header("Location: http://www.main-page-url.com/"); 
} 

?> 

這樣做的原因是,當瀏覽器從Web服務器接收到信息後,收到HTTP標頭(其中header()函數輸出重定向到),然後在HTTP標頭之後輸出HTTP響應的主體。如果您的腳本在標題命令之前有任何內容,您將繼續收到該錯誤。

+0

我知道。我以爲我有另一個問題。現在我發現了一個require_once「file.php」;命令是問題 - 任何想法爲什麼? – AYBABTU 2011-01-26 13:04:27

1

由於您嘗試在內容已呈現到頁面後向瀏覽器發送新標題,因此您無法修改標題信息消息。如果在任何回顯/打印調用之前執行header()調用,它將重定向。否則,你需要一個元重定向。您發佈表單的位置無關緊要。

1

這不起作用的原因是標頭先於HTTP請求中的內容。當你輸出內容時,PHP通過發送所有頭文件和所有到目前爲止處理的內容來領先於遊戲。發送HTTP請求時沒有CTRL + Z,因此header()函數在發送之後無法添加標頭。

但是,如果使用ob緩衝功能家族,則可以在回顯內容後調用header()。調用ob_start()緩衝頁面輸出,進行必要的標題調用或內容輸出,最後用ob_end_flush()發送輸出。防爆。

<?php 
ob_start(); //Start buffering 
?> 
<p>This is output!!!</p> 
<?php 
header('403 Moved Permanently'); //Fancy redirect is fancy 
ob_end_flush(); //Send page content with redirect header 
?> 

唯一可能的缺點,使用緩衝的是,用戶將在接收所述內容,直到ob_end_flush()命令稱爲感覺到輕微的掛斷。儘管這很可能不會引人注目,所以你不應該擔心!

在完成所有這些之前,您可能會考慮在代碼輸出內容之前將所有標題調用移動到某個位置。還要檢查前面空格的PHP標記,因爲它們會強制標題和內容發送。

相關問題