在单个代码行中有多个header()+die()实例


Multiple instances of header() + die() in single code line

我正在尝试操作一个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);

说明:xoror一样,不同之处在于它保证了两边的表达式都得到求值并且不会短路。(好吧,xoror有所不同,但就这个答案而言,这并不重要。)

$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/');