我正在尝试操作一个PHP脚本,以便它重定向到一个特定的URL,而不是给我一个MySQL错误。所以我从这个开始。。。
$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()的两个实例组合在一起(即,不改变这一行周围的内容)。
除了"你不应该这样做"的注释外,还有以下方法:
$qs = mysql_query(...) or (header(...) xor die);
说明:xor
和or
一样,不同之处在于它保证了两边的表达式都得到求值并且不会短路。(好吧,xor
与or
有所不同,但就这个答案而言,这并不重要。)
$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());
}
您可以使用if
块:
$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;");
if (!$qs) {
header("Location: http://www.example.com");
die('MySQL error: '.mysql_error());
}
您可以始终:
$qs = mysql_query("blah");
if (!$qs) {
//headers
header('Location: blah');
die('MySQL error: '.mysql_error());
}
显示die消息没有任何意义,因为任何浏览器都会捕获HTTP状态代码并采取相应行动,而忽略文档的内容。在那里,您应该使用exit()命令,该命令执行相同的操作,减去对缓冲区执行echo。
您可能正在使用此回退操作,所以为什么不将其作为一个常见的回退功能:
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/');