【问题标题】:Multiple instances of header() + die() in single code line单个代码行中 header() + die() 的多个实例
【发布时间】:2011-09-08 12:39:37
【问题描述】:

我正在尝试操作一个 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() 的两个实例结合起来(即不改变周围的内容)这一行)。

【问题讨论】:

  • 请告诉我你正在清理你的输入。 D:

标签: php redirect header die


【解决方案1】:

您可以使用if 块:

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

【讨论】:

  • mysql_query 不使用异常;那将是使用 ERRMODE_EXCEPTION 的 PDO。
  • 这将如何运作? mysql_query 不会产生任何异常。
【解决方案2】:

显示 die 消息没有任何意义,因为任何浏览器都会捕获 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/');

【讨论】:

【解决方案3】:

除了“你不应该这样做”说明之外,你可以这样做:

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

解释:xoror 一样,区别在于保证两边的表达式都被求值并且不会短路。 (好吧,xoror 不同,但对于这个答案而言,这并不重要。)

【讨论】:

  • 这使它很好地保持在一行中,并且工作得很好。我必须添加 301 并以 $qs = mysql_query(...) or die(header('Location: http://www.example.com',TRUE,301)); 结尾。看起来我不需要为 301 再次出现 header()$http_response_code 参数也是如此。谢谢!
【解决方案4】:
$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());
}

【讨论】:

    【解决方案5】:

    你总是可以的:

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

    【讨论】:

    • 你需要抑制来自mysql_query的错误;否则,它会抛出一个错误。
    • @mc10 这取决于 php 配置设置,但可能是一个有效点。
    • 呃,没看出这是mysql_query,而不是mysql_connect。忘记我的评论。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多