2011-06-04 78 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