2013-03-09 22 views
0
if(isset($_POST)) 
{ 
    if(verify_post_data() == 'success') 
    { 
    if(do_something_with_verified_post_data() == 'success') 
    { 
    //do something else 
    header('location: success.php'); 
    } 
    } 
    header('location: failure.php'); 
} 

我想處理一個用戶已張貼在多個步驟中的數據(第一個驗證,如果一切都正確,然後對數據進行處理的東西) 。頭('位置:...)犯規行爲的權利結合if語句

如果後期數據的驗證,並做有什麼事情已經成功了,我想將用戶重定向到success.php

如果驗證失敗,或者做一些與數據失敗,我想重定向失敗。

這裏發生的事情:

當我刪除頁眉(...)函數進行評論,而是我說

//header('location: success.php'); 
echo 'success!'; 

//header('location: failure.php'); 
echo 'failure!'; 

我的腳本將打印「成功!失敗!」如果我的數據是正確的,並且在處理數據時沒有發生錯誤。非常有意義......因爲成功的迴應並未中斷腳本,故障仍會顯示。

所以當我取消成功頭(失敗頭撐評論),它確實給我以success.php

如果我隨後也取消對失敗的頭,現在它將 - 即使在成功 - 給我到failure.php。

這怎麼可能?

我希望頭函數能夠中斷腳本並忽略它後面的任何代碼。我的假設錯了嗎?我必須以某種方式手動退出腳本?

不是php按行處理代碼?或者它是否首先在花括號裏標題和其他標題,或者什麼?

或者應該不會發生這種情況,我必須在其他地方發生錯誤?

+2

把一個'退出;'頭()後';' – tttony 2013-03-09 04:50:25

+0

請確保您有在同一文件夾 – sandip 2013-03-09 04:54:53

+0

問題是不是所有的樹中的文件,該頭功能沒有按'不做任何事情,因爲我在調用頭之前有輸出,也沒有被重定向到404。從我有兩個頭選項我被稱爲錯誤的... – olli 2013-03-09 05:00:40

回答

1

是由PHP行執行行。
可能有一些錯誤在你發佈的數據, 如果你寫位置的2頭,第一個將得到執行,
但也是腳本的其餘部分被執行,
爲了避免這種情況,你需要調用退出;或者如果用戶發佈了錯誤的數據,只需使用die()函數。 也試試下面這段代碼:

if(do_something_with_verified_post_data() == 'success') 
{ 
//do something else 
header('Location: success.php'); 
exit; 
} 
else 
{ 
header('Location: failure.php'); 
exit; 
} 
1

首先在header之前和之後不要使用echo。在header之後使用exit

if(isset($_POST)) 
{ 
    if(verify_post_data() == 'success') 
    { 
    if(do_something_with_verified_post_data() == 'success') 
    { 
     //do something else 
     header('location: success.php'); 
     exit(); 
    } 
    } 
    header('location: failure.php'); 
    exit(); 
} 
+0

就是這樣,我必須使用退出。 ..我沒有迴應任何事情,但這不是問題... – olli 2013-03-09 05:02:04

3

頭函數不會中斷腳本並忽略任何後面的代碼。因此,在所有情況下,位置標題以location: failure.php 的形式發送。將location: failure.php放入其他部分將是一個更好的主意。如果你已經安裝了螢火蟲,您可以檢查響應頭的螢火

+0

你是對的。但我不能使用其他部分,如果我不想重複我的代碼不幸 – olli 2013-03-09 05:04:14

0

的「淨」 A組similar problem導致我的回答

我必須調用exit();在調用header()之後...

我剛試過了,當調用exit函數時,一切正常。因此很明顯,我的假設

我想到頭功能中斷的腳本,並忽略之後不能有任何代碼。

是錯的......!

1

首先, 在致電header()之前請勿使用echo/setcookie()

其次, 你需要抽象重定向,像這樣:

function redirect($location){ 

    if (! headers_sent()){ 
    header(sprintf('Location : %s', $location)); 
    exit; 
    } 
} 


if(! empty($_POST)) // isset() is good for array keys, not for this one itself 
{ 
    if(verify_post_data() == 'success') 
    { 
    if(do_something_with_verified_post_data() == 'success') 
    { 
    //do something else 
    redirect('success.php'); 
    } 
    } 
    redirect('failure.php');