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

用php向用户显示错误/消息的好方法是什么?,php,error-handling,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("Locat

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

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

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(){
全球会议;
如果(isset($_会话[“消息]){
回显“$”会话[“消息”];
取消设置($_会话[“消息]);
取消设置($_会话[“消息类型]);
}
}
我把show_message()放在;在每个页面的顶部显示可能会抛出到此页面的错误


这可能有什么问题

我认为这种方法没有错。例如,在相当多的框架中,您可以在不同的名称下找到这种技术。 通常会话包装在对象中而不是常规会话数组中,并使用ViewHelper而不是函数

为了确保在分配消息时会话键中没有任何打字错误,您也可以将分配代码包装到函数中,例如

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"]);
返回sprintf(“%s”,
$\u会话[“消息”][“文本”],
$_会话[“消息”][“类型”]);
正如@Gumbo所指出的,当会话不起作用时,函数可能不起作用,但这可能会给整个应用程序带来许多其他问题,因此我不想再为这段特定的代码费心了


次要事项:$\u会话是一个,因此您不必使用
global
关键字。

老实说,我不会使用会话,而是使用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
}
如果您只显示一条消息,那么它实际上不是“敏感”数据,因此将其放在URL中应该是完全正确的

那你就

 header('Location: register.php?message=0');
使用/不使用cookie,您可以更集中地使用它。如果要更改消息的措辞,则所有消息都位于同一位置


只是想一想……

如果客户端不接受cookies,会话就不能工作怎么办?我的印象是php通过URL传递SID来处理这个问题。编辑:我的印象是错误的,它不起作用我唯一要添加的是将这些函数转换为专用类的方法。在各种框架中,这种方式使用的消息传递通常称为flash消息传递。所以这可能是你的FlashMessage类的基础。@Yegor现在没问题了。
unset
s与echo位于同一行。通常使用会话发送消息。URL看起来会很乱吗?