我多年来一直在使用自己的方法,但我认为这可能不是最好的方法。
基本上当我想向用户抛出错误或显示成功操作的确认时,我会执行以下操作:
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();在每个页面的顶部显示可能出现在此页面上的错误。
这有什么问题?
答案 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,您可以更集中。如果您想更改邮件的措辞,则所有邮件都在同一个位置。
只是一个想法......