Как я могу отобразить статический HTML после того, как я использовал die() в блоке PHP?

Допустим, у меня есть такой код:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

Я надеюсь, что цель этого кода проста. Если определенное условие выполнено (то есть не может подключиться к базе данных), то программа должна умереть, но в противном случае она должна выполняться. Моя проблема возникает при выполнении функции die(). Он останавливается прямо здесь и отправляет в браузер только первые три строки, но не последние две строки.

Есть ли функция, которую я могу использовать вместо die(), чтобы блоки php перестали выполняться, но статический HTML-текст по-прежнему передается через?

10 ответов

Решение

Вы должны разделить верхний и нижний колонтитулы на отдельные файлы и функции. Это значительно упрощает поддержку пользовательского интерфейса и обеспечивает согласованность при отображении представления. Соедините это с использованием обработки исключений, и вы получите отличную оценку.

<?php

printHeader(); // outputs the html header
try
{
    if (some condition)
    {
        throw new Exception("It Died...");
    }
    // More processing here that should not execute if the above condition is true
    // ...
}
catch (Exception e)
{
    echo $e->getMessage();
}
printFooter(); // outputs the html footer

?>

Отделите логику вашей программы от презентации. Читайте про MVC, шаблоны.

В простейшей форме это выглядит так:

<?php
function logic() {
    if (!$someCondition) {
        return 'display_empty_page';
    } else {
        return 'display_other_stuff';
    }
}

presentation(logic());



Для других случаев, когда die() или такое неизбежно (например, фатальная ошибка или умирание стороннего кода), существует хак с обработчиком вывода:

ob_start('myhandler'); 
function myhandler($page) {return $page.' extra markup';}
die();

Хотя я рекомендую использовать это только для диагностики / отладки.

Передайте кубу параметр статического текста.

Например, измените это:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

К этому:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die("OMG RED ALERT!!!!</body></html>");
}
else{
  #Do something
}
?>
</body>
<html>

Я бы, вероятно, использовал исключения. Оберните все в блок try / catch, а затем создайте новое исключение в случае ошибки, например, сбоя базы данных. Вы ничего не могли бы сделать в блоке catch (как пустой метод die()), но было бы лучше представить здесь сообщение об ошибке пользователю.

Вот довольно хорошее руководство по обработке исключений в PHP5 на тот случай, если вы с ними не знакомы или вам нужно разобраться с тем, что изменилось с PHP4.

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
header ("location:error_page.php?erro_message='This error occured'");

  die();
}
else{
  #Do something
}
?>
</body>
<html>

error_page.php

header
echo $_GET[$error_message];
footer

Если вы работаете с PHP4 или просто не хотите беспокоиться об исключениях, вы можете использовать эту технику:

<html>
<head><title>Title</title></head>
<body>

<?php
do {
    if (!$someCondition){
          break;
    } else {
          #Do something
    }
} while (0);
?>
</body>
<html>

... хотя некоторые люди, кажется, весьма против использования этого стиля, прокомментированы соответствующим образом, я не вижу никаких проблем с ним. Я бы сказал, что это гораздо лучше, чем дублировать код "нижнего колонтитула" в каждом из ваших операторов die().

Вы смотрели на использование register_shutdown_function (php.net) завершить загрузку страницы? Это должно быть в состоянии справиться die() а также exit(),

die() может быть не совсем то, что вы хотите здесь. Почему бы не заменить

if (!$someCondition) { 
    die();
} else {
    /* do stuff */
}

с

if ($someCondition) {
    /* do stuff */
} else {
    /* output error message/redirect/output nothing/whatever */
}

или бросить / поймать исключение?

Один метод, который работает, но не совсем то, что я ищу, это заменить die() с die("</body></html>"), Если возвращаемый текст был более сложным, чем это, он мог бы, скажем, быть сохранен в переменной. Есть ли что-нибудь лучше, чем это?

Если вы посмотрите на документацию PHP, вы увидите, что "Эквивалент к выходу ()" - то есть вызов его завершает вашу программу и на самом деле не дает вам большого шанса что-либо сделать. Даже за пределами ZF не так уж много можно сделать, когда приложение умирает (). Решение состоит в том, чтобы использовать исключения.

Необработанное исключение по сути то же самое, что и die() (кроме генерируемой трассировки стека). Исключением является возможность поместить его в блок try/catch, что дает вам возможность исправить ошибку и продолжить работу с программой (или отобразить дружественное сообщение об ошибке и сгенерировать журнал). Предполагая, что вы используете Zend_Controller_Front, вы можете проверить быстрый старт Zend Framework, чтобы увидеть, как они создают обработчик ошибок по умолчанию, который будет перехватывать необработанные исключения и отображать соответствующее сообщение об ошибке.

Другие вопросы по тегам