我不确定填充通知页面的最佳方法是什么。我一直在使用会话来填充信息,但如果用户阻止cookie,则会出现这种情况。我已经考虑过在HTTP GET变量中传递它,但我不确定它是否是一个很好的选择,因为它的长度受到某些浏览器的限制。
您更喜欢哪种方式?
答案 0 :(得分:1)
您可以尝试使用索引的错误消息列表,然后只需将错误ID作为GET参数传递给页面。你不能真正使用POST,因为我想你会重定向到错误页面,因此GET请求几乎是你最好的选择。
另一种方法是在原位设置错误页面 - 即用户停留在同一个URL上,但获取修改后的HTTP状态代码(即“未找到”为404,服务器为500)错误等)以及错误消息。这样您就不必担心通过HTTP请求填充页面,只需在遇到错误的页面中执行此操作即可。
我更喜欢第二种方法,即使它更难实现。有了它,您可以使用错误和异常处理程序自动捕获任何错误情况,然后触发错误输出代码。
答案 1 :(得分:0)
有些通知属于生成它们的页面,例如表单字段中的错误。这些都很容易处理。我通常创建一个数组来保存它们的HTML格式并使用函数将它们显示为HTML列表:
<?php
$errors = array();
function print_errors($errors){
if( !empty($errors) ){
echo '<ul><li>' . implode('</li><li>', $errors) . '</ul>';
}
}
# ...
if($foo<=0){
$errors[] = '<label for="foo">Foo</label> is <strong>' . htmlspecialchars($foo) . '</strong> but it must be greater than zero.';
}
if(empty($errors)){
save_stuff();
header('Location: http://example.com/somewhere/else/');
exit;
}
# ...
print_errors($errors);
echo '<form action="" method="post">';
echo '<input type="text" name="foo" value="' . htmlspecialchars($foo) . '" id="foo">';
echo '</form>';
# ...
?>
然后是您描述的情况:在成功(或不可能)动作之后,用户被重定向到其他地方(例如,主要部分页面),在那里他得到解释。对于短消息,我倾向于使用以纯文本形式保存消息的GET变量:
<?php
if( isset($_GET['error']) ){
echo '<p class="error">' . htmlspecialchars($_GET['error']) . '</p>';
}
if( isset($_GET['message']) ){
echo '<p class="message">' . htmlspecialchars($_GET['message']) . '</p>';
}
?>
这对于内部网来说非常好,但它有两个缺点:
如果您有一些可用的存储空间(文件,数据库等),您可以保留完整的HTML消息并为其分配随机ID:
ID: 4a0a19218e082a343a1b17e5333409af9d98f0f5
Date: 2010-05-25 11:24:30
Type: message
HTML: <a href="/item/25">Item #25</a> was modified successfully.
http://example.com/?msg=4a0a19218e082a343a1b17e5333409af9d98f0f5
确保您保存日期,以便您可以随时清理旧数据。
我的两分钱。
答案 2 :(得分:0)
还可以将PHP会话ID附加到页面上的每个链接,因此如果cookie失败,您可以回退到这一点。
如果那是不可能的,我还会将消息保存到数据库并使用$ _GET传递唯一ID。