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

StackOverflow https://stackoverflow.com/questions/307322

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

с

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

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

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

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

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

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

<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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top