在PHP块中使用die()之后如何显示静态HTML?

时间:2008-11-20 23:47:22

标签: php die

假设我有一些像这样的代码:

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

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

我希望这段代码的目的很简单。如果满足某个条件(即无法连接到数据库),那么程序应该死掉,否则它应该执行。执行die()函数时出现问题。它在那里停止正确,并且只将前三行发送到浏览器,而不是最后两行。

是否有一个功能,我可以使用而不是die(),以便php块将停止执行,但静态HTML文本仍然通过?

10 个答案:

答案 0 :(得分:7)

将程序逻辑与演示文稿分离。阅读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();

虽然我建议仅将其用于诊断/调试目的。

答案 1 :(得分:2)

您应该将页眉和页脚分隔成单独的文件和函数。这使得UI更易于维护,并使呈现视图的内容保持一致。结合使用Exception handling并且你是金色的。

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

?>

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我可能会使用例外。将所有内容包装在try / catch块中,然后在数据库失败等错误情况下抛出新异常。你可以在catch块中做任何事情(就像一个空的die()方法),但最好在这里向用户提供一条错误信息。

如果您不熟悉PHP5中的异常处理,那么这里有一个pretty good guide,或者您需要了解自PHP4以来的更改。

答案 4 :(得分:0)

一种方法可行,但不是我正在寻找的方法,将die()替换为die("</body></html>")。如果要返回的文本比这更复杂,那么它可以存储在变量中。还有什么比这更好的吗?

答案 5 :(得分:0)

die()可能不完全是你想要的。为什么不替换

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

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

或抛出/捕获异常?

答案 6 :(得分:0)

您是否考虑过使用register_shutdown_function(php.net)来完成加载页面?它应该能够处理die()exit()

答案 7 :(得分:0)

如果你看the PHP Documentation,你会看到“相当于退出()” - 即调用它会终止你的程序,并没有给你很多机会做任何事情。即使在ZF之外,当应用程序die()时,你也无法做很多事情。解决方案是使用例外。

未捕获的异常与die()基本相同(除了生成的堆栈跟踪之外)。异常给你的是能够将它放在try / catch块中,让你有机会纠正错误并继续使用程序(或显示友好的错误消息并生成日志)。假设您正在使用Zend_Controller_Front,您可以查看Zend Framework Quickstart以查看它们如何创建一个默认错误处理程序,以捕获未捕获的异常并显示相应的错误消息。

答案 8 :(得分:0)

如果你正在使用PHP4,或者只是不想打扰异常,那么你可以使用这种技术:

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

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

..虽然有些人似乎非常反对使用这种风格,但有适当的评论,我认为没有任何问题。我说这比在每个die()语句中复制你的“页脚”代码要好得多。

答案 9 :(得分:0)

<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