如何优雅地死?

时间:2011-03-24 20:51:12

标签: php forms error-handling hidden-field

所以我刚看了Why to never use 'or die'.

我比以前更困惑。我正在验证一个复杂的表单,我会通过if语句的多个嵌套级别,然后我会将一个变量传递给名为$ status的表单,该表单只能是'new'或'edit'。然后,当用户再次提交要验证的表单时,表单将$ status值作为隐藏字段($ _POST)传递。我想确保用户不会意外地改变这个,所以我想抓住错误,如果“新”或“编辑”以外的东西通过。 (虽然我想完全消除用户在理想世界中影响这个变量的可能性。)

所以我想我会在if语句中使用DIE()

<nested ifs>
    Select ($status){
        Case 'edit':
            break;
        Case 'new':
            break;
        default:
            //using example from article
            trigger_error("An error that should not occur has occurred", E_USER_ERROR);
            break;
    }
</nested ifs>

我真的不明白这比干()更干净吗?本质上我想调用另一个函数,向用户显示他们在这个时刻可以做些什么选项来修复错误,但我希望代码绝对停止运行,因为我不希望if语句进一步向下继续解析任何事情,当发现“新”或“编辑”以外的其他内容时会产生错误。

我不确定我有多清楚所以请随时让我详细说明任何不明确的观点。 (或者更好的是,隐藏的用户字段是否可以被黑客入侵?如何预防?:P)

2 个答案:

答案 0 :(得分:6)

trigger_error()触发由错误处理程序处理的错误。

使用trigger_error(),您可以优雅地处理错误,例如:

  set_error_handler('ErrorHandler');

  function ErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
  {
    print '<pre style="line-height: 2em;">';
    printf("==> Error in `%s' line %s: %s\n\n", $filename, $linenum, $errmsg);
    debug_print_backtrace();
    print '</pre>';

    exit($errno);
  }

这是一个简单的例子,但是我们公司的网站显示了一个友好的错误页面,并向我发送了一封电子邮件,我是一个白痴,并在某处搞砸了: - )

优于die()exit()的优势应该是明确的: - )

您需要退出时仍可使用

exit()。例如,当您生成模板时,输出该模板,并希望代码执行停止。或者,当您发送header('Location: ...');标头并希望确保执行停止时......只是不要用它来处理意外情况(即错误)。

trigger_error()也为您提供了更好的控制力。您可以在希望执行停止但是显示通知时发送E_USER_NOTICE,并在希望执行停止时发送E_USER_ERROR

此外,你可以编写更复杂的错误处理函数,其中一些IP看到错误,其余的不会...... Kindda对开发很有用。

虽然过于复杂的错误处理程序,但要小心,错误处理程序内部会发生错误...?您可能已经看过Inception:)

答案 1 :(得分:1)

您链接的文章解释了您不应该使用or die的原因,如:

$result = mysql_query($query) or die('A MySQL query occurred: ' . mysql_error());

显然这是个坏主意,因为它可能会向恶意用户输出有关MySQL结构的敏感信息。

但是,我认为在你使用它的方式中使用die并没有错(我认为文章的作者会同意我的意见),尽管向用户提供一个选项列表会事实上,这是处理这个问题的首选方式。