Несколько экземпляров header () + die () в одной строке кода - PullRequest
7 голосов
/ 05 июня 2011

Я пытаюсь манипулировать сценарием 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 () в этой единственной строке кода (т.е. без изменения того, что происходит вокруг этой конкретной строки).

Ответы [ 5 ]

4 голосов
/ 05 июня 2011

В дополнение к примечаниям «Вы не должны этого делать», вот как вы могли бы это сделать:

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

Объяснение: xor похоже на or с той разницей, чтоГарантируется, что выражения с обеих сторон будут оценены и не будут закорочены.(Хорошо, xor отличается от or, но для целей этого ответа это не имеет значения.)

3 голосов
/ 05 июня 2011
$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());
}
3 голосов
/ 05 июня 2011

Вы можете использовать блок if:

$qs = mysql_query("SELECT url FROM $table WHERE `id` = $gid;");
if (!$qs) {
    header("Location: http://www.example.com");
    die('MySQL error: '.mysql_error());
}
2 голосов
/ 05 июня 2011

Вы всегда можете:

$qs = mysql_query("blah");
if (!$qs) {
   //headers
   header('Location: blah');
   die('MySQL error: '.mysql_error());
}
0 голосов
/ 05 июня 2011

Нет смысла отображать сообщение «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/');
...