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

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

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

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

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

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

Ответы [ 10 ]

7 голосов
/ 21 ноября 2008

Отделите логику вашей программы от презентации. Читайте о 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();

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

2 голосов
/ 21 ноября 2008

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

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

<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>
2 голосов
/ 21 ноября 2008

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

<?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

?>
1 голос
/ 21 ноября 2008

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

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

0 голосов
/ 24 июня 2013
<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
0 голосов
/ 21 ноября 2008

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

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

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

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

0 голосов
/ 21 ноября 2008

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

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

0 голосов
/ 21 ноября 2008

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

0 голосов
/ 21 ноября 2008

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

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

с

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

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

0 голосов
/ 21 ноября 2008

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

...