什么是在PHP中向用户显示错误/消息的好方法?

时间:2010-02-05 07:19:25

标签: php error-handling

我多年来一直在使用自己的方法,但我认为这可能不是最好的方法。

基本上当我想向用户抛出错误或显示成功操作的确认时,我会执行以下操作:

if($something == "condition") {

   $_SESSION["message"] = "Your passwords didnt match! Make sure they are the same in both fields!";
   $_SESSION["message_type"] = 1;
   header("Location:register.php");
   exit();

}

然后我有一个像

这样的功能
function show_message() {
   global $_SESSION;

   if (isset($_SESSION["message"])) { 
      echo "<div class='site_message type_" . $_SESSION["message_type"] . "'>" . $_SESSION["message"] . "</div>"; 
      unset($_SESSION["message"]); 
      unset($_SESSION["message_type"]); 
   }
}

我把show_message();在每个页面的顶部显示可能出现在此页面上的错误。

这有什么问题?

2 个答案:

答案 0 :(得分:3)

我认为这种做法没有错。你可以在很多框架中以不同的名称找到这种技术,例如FlashMessenger in Zend Framework。 通常,Session被包装在一个对象中而不是常规的Session数组中,而是一个ViewHelper而不是一个函数。

为了确保在分配消息时Session键中没有任何拼写错误,您也可以将分配代码包装到一个函数中,例如

function set_message($text, $type)
{
    $_SESSION['message'] = array(
        'text' => $text,
        'type' => $type
    );
}

您可以通过让函数返回字符串而不是echo来改进它,并且我个人会使用sprintf来格式化输出。使代码更具可读性,例如。

return sprintf('<div id="message-box" class="type-%s">%s</div>',
                $_SESSION["message"]["text"], 
                $_SESSION["message"]["type"]);

就像@Gumbo指出的那样,当Sessions不起作用时,该功能可能不起作用,但这可能会给整个应用程序带来许多其他问题,所以我不会完全关心这段特定的代码然后

小事:$ _SESSION是superglobal,因此您不必使用global关键字。

答案 1 :(得分:1)

老实说,我不会使用Sessions,而是使用URL。

创建一个包含“系统消息”

的类,而不是设置消息
 class SystemMessages{
    protected $messages = array(
          0 => "Some Error Message");

    public function getMessage($id)
    {
        return $this->messages[$id];
    }
 }

然后,在您的register.php上,检查URL参数:

$messageObject = new SystemMessages;
if(!empty($_GET['message']))
{
    $message_id = intval($_GET['message']); // Clean User Input
    $message = $messageObject->getMessage($message_id);
    // handle message
}

如果您只是显示一条消息,那么它确实不是“敏感”数据,因此将其放入网址应该非常好。

然后你就

 header('Location: register.php?message=0');

使用/不使用Cookie,您可以更集中。如果您想更改邮件的措辞,则所有邮件都在同一个位置。

只是一个想法......