2010-05-27 91 views
2

我正在創建一個簡單的網站。我的情況就是這樣。註冊用戶後,我想在用戶說3秒後將用戶重定向到主頁面(如果註冊成功)。我現在的代碼如下註冊後重定向用戶時出現問題

$query = "INSERT INTO Privileges VALUES('$user','$password1','$role')"; 

$result = mysql_query($query, $dbcon) 
or die('Registration Failed: ' . mysql_error()); 
print 'Thanks for Registering , You will be redirected shortly'; 

ob_start(); 

echo "Test"; 

header("Location: http://www.php.net"); 

ob_flush() 

我得到錯誤信息 警告:不能更改頭信息 - 頭已經發出(輸出通過/ home /斯里尼瓦沙/的public_html/ThanksForRegistering.php開始 :27) in/home/srinivasa /public_html/ThanksForRegistering.php on line 35.

我現在需要做什麼?

回答

2

首先,刪除和打印聲明,並讓我們知道發生了什麼。

+0

他的問題的其他解決方案中的一個與發送HTTP報頭他已經發送了內容。隨時重新閱讀他的問題,並退出我的投票。 – 2010-05-27 20:22:48

+1

Ian在這裏是正確的... – Zak 2010-05-27 20:23:55

+2

@Ian P:這不是一個答案,它應該是一個評論。 – 2010-05-27 20:24:56

1

您無法從PHP中執行此操作,因爲在頁面發送到客戶端之前,所有操作都會得到評估。你可以做的是輸出一些JavaScript,它在3秒後通過重定向。

它看起來是這樣的(我不知道PHP的非常好,所以我不知道什麼是ob_startob_flush做):

$query = "INSERT INTO Privileges VALUES('$user','$password1','$role')"; 

$result = mysql_query($query, $dbcon) 
or die('Registration Failed: ' . mysql_error()); 
print 'Thanks for Registering , You will be redirected shortly'; 
print '<script type="text/javascript">' 
print 'setTimeout(function() { window.location = "http://www.php.net"; }, 3000);' 
print '</script>' 

ob_start(); 
ob_flush(); 
+0

ob函數確實輸出緩衝。基本上,當啓動被調用時,輸出存儲在緩衝區中,當調用ob_flush時發送。如果OP將ob_start()放在開頭,那麼就不會有問題,因爲它會緩衝輸出並在任何內容之前發送標題。 – 2010-05-27 20:31:48

+0

@Arda:雖然沒有顯示任何「感謝註冊」文本,但是沒有做過重定向嗎? – Claudiu 2010-05-27 20:33:52

+0

是的,但問題(錯誤)將消失。 – 2010-05-27 22:04:07

0

你不能echo 'test'或打印的任何其他信息給瀏覽器,然後設置一個重定向頭...如果你發送文本的頭文件/ HTML發送到瀏覽器,其次是內容。

發送非標題內容後重定向的唯一方法是通過javascript。所以如果你想在重定向之前告訴客戶端某些東西,你可以做2件事中的1件。

1),將3秒計的頁面上發送的JavaScript,然後做重定向

2)設置刷新頭(呼應的任何東西),刷新同一個頁面,而當刷新發生重定向之前。

<?php 

// refresh/redirect to an internal web page 
// ------------------------------------------ 
header('refresh: 5; url=/webdsn/'); 
echo '<h1>You will be re-directed in 5 seconds...</h1>'; 

從這個位置快速谷歌搜索: http://www.desilva.biz/php/phprefresh.html

+0

你是對的..編輯不要呼籲所有的人忽略「警告:不能修改標題信息 - 已發送標題」警告延遲。 – Zak 2010-05-27 20:28:42

+0

當談到嘗試重定向時,人們確實很有創意。不幸的是,HTTP規範中沒有'refresh'標頭。 – 2010-05-27 20:30:15

+0

我必須說明,我很久沒有使用刷新標題,但只記得它..維基百科說它是通過原始的netscape瀏覽器引入的東西: http://en.wikipedia.org/wiki/URL_redirection#Refresh_Meta_tag_and_HTTP_refresh_header 而不是HTTP規範的一部分。 – Zak 2010-05-27 20:50:14

1

爲了在3秒後,將用戶重定向,你有兩個選擇。

首先,刪除header函數。

然後你就可以使用JavaScript:

<script type="text/javascript"> 
    setTimeout('function() {window.location = "http://example.com";}',3000); 
</script> 

或在頭部元刷新標籤:

<meta http-equiv="refresh" content="3;url=http://example.com/" /> 

您不能單獨用PHP做。

+0

必須修正你的JavaScript,它不會做任何事情。如果'redirect()'以某種方式被調用,那麼它會每3秒繼續調用一次。 – Claudiu 2010-05-27 20:26:17

+0

在您離開評論並修復它之前,我意識到這一點。 – 2010-05-27 20:28:13

0

使用JavaScript代替,以便您可以確保文本在屏幕上打印。

您可以使用方法here作爲一個選項。

請確保包含一個鏈接,讓他們點擊,如果由於某種原因,JavaScript不能在他們的瀏覽器中工作。

1

我想問題是'你爲什麼重定向?'。如果你想在註冊之前將用戶發送到他們想要的頁面,並仍然給予他們一個友好的「感謝註冊」消息,你可以考慮將成功消息放入$_SESSION變量並在目標頁面上回顯。

喜歡的東西:

//process registration 
if($success) { 
    $_SESSION['reg_success']="You're one of us now!"; 
    header("Location: http://www.php.net"); 
    exit; 
} 
//otherwise have another go at registering 
+0

或者可能像$ _SESSION ['message']這樣可以發送失敗。 – 2010-05-28 04:26:00

0

您的問題,您嘗試修改您的標題之前輸出被創建。嘗試像這樣重新排序代碼。

$query = "INSERT INTO Privileges VALUES('$user','$password1','$role')"; 

ob_start(); 

$result = mysql_query($query, $dbcon) 
or die('Registration Failed: ' . mysql_error()); 
print 'Thanks for Registering , You will be redirected shortly'; 


echo "Test"; 

header("Location: http://www.php.net"); 

ob_flush(); 

這整流你的頭的錯誤消息,但你以後將不得不使用貼做重定向位JavaScript或meta標籤

+0

雖然在顯示消息之後不會重定向。 – 2010-05-27 20:32:58