2011-06-04 80 views
7

我試圖操縱一個PHP腳本,以便它重定向到特定的URL而不是給我一個MySQL錯誤。所以我從這個去...單個代碼行中的header()+ die()的多個實例

$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;") or die('MySQL error: '.mysql_error()); 

...這樣的:

$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;") or header("Location: http://www.example.com"); 

其中一期工程,但也有讓我擔心兩件事情。首先,它默認爲302重定向,我更喜歡301重定向。其次,我擔心通過從這一行刪除die(),腳本在重定向之後不能正常退出。

現在,我在這裏做了一些家庭作業,但我不能完全弄清楚是否可以在單行代碼中將die()與header()的兩個實例組合起來(即不改變圍繞這條特定線路)。

+1

請告訴我你的消毒有投入。 D: – damianb 2011-06-04 21:17:14

回答

4

除了 「你不應該這樣做」 筆記,這裏是你如何能做到這一點:

$qs = mysql_query(...) or (header(...) xor die); 

說明:xor就像or所不同的是它保證了兩側的表達式得到評估並且不會短路。 (好吧,xoror有些不同,但爲了這個答案的目的不重要。)

+4

'...或死(標題(...));' – mario 2011-06-04 21:23:40

+0

@mario:不錯的一個:) – NikiC 2011-06-04 21:24:25

+0

這使它很好地保持在一條線上,並且非常有效。我必須在301中添加,並以'$ qs = mysql_query(...)或者die(header('Location:http://www.example.com',TRUE,301))結尾';'看起來像我不需要另外爲'301(')提供'header()'; '$ http_response_code'參數也是一樣的。謝謝! – redburn 2011-06-04 23:18:57

3

你可以使用一個if塊:

$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;"); 
if (!$qs) { 
    header("Location: http://www.example.com"); 
    die('MySQL error: '.mysql_error()); 
} 
+0

mysql_query不使用異常;那將是使用中的ERRMODE_EXCEPTION的PDO。 – damianb 2011-06-04 21:20:28

+0

+1請求使用特殊處理 – 2011-06-04 21:21:04

+1

這是如何工作的? 'mysql_query'不會產生任何異常。 – mario 2011-06-04 21:21:06

2

你總是可以:

$qs = mysql_query("blah"); 
if (!$qs) { 
    //headers 
    header('Location: blah'); 
    die('MySQL error: '.mysql_error()); 
} 
+0

你需要抑制來自'mysql_query'的錯誤;否則,它會拋出一個錯誤。 – mc10 2011-06-04 21:20:11

+0

@ mc10這是依賴於PHP配置設置,但可能是一個有效的點。 – Fosco 2011-06-04 21:21:14

+0

呃,沒有看到這是'mysql_query',而不是'mysql_connect'。忘記我的評論。 – mc10 2011-06-04 21:46:36

3
$query_string = ''; 
$location = ''; 

$qr = mysql_query($query_string); 
if (!$qr) { 
    header ('HTTP/1.1 301 Moved Permanently'); 
    header ('Location: '.$location); 
    die('MySQL error: '.mysql_error()); 
} 
0

沒有任何目的顯示死信息,因爲任何瀏覽器都會捕獲HTTP狀態代碼並採取行動因此忽略了文件的內容。在那裏,你應該使用exit()命令,它執行相同的操作,減去任何緩衝區的回顯。

您可以使用此回退操作,爲什麼不只是讓一個共同的回退功能:

function fallback($location='/default/path/to/somewhere') { 
    header('HTTP/1.1 301 Moved Permanently'); 
    header('Location: '.$location); 
    exit(); 
} 

$query = mysql_query('...') or fallback('/path/to/somewhere/'); 
+0

fyi,die()是exit()的別名,行爲完全一樣:http://us3.php.net/manual/en/function.die.php - 你可以使用die()任何東西都不會迴應緩衝區。 – damianb 2011-06-04 21:33:56