Php 将数据传递到通知页面
我不确定填充通知页面的最佳方式是什么。我一直在使用会话来填充信息,但是如果用户阻止cookie,这就不够了。我已经考虑过将它传递到HTTP GET变量中,但我不确定它是否是一个好的选择,因为它的长度受到一些浏览器的限制Php 将数据传递到通知页面,php,error-handling,Php,Error Handling,我不确定填充通知页面的最佳方式是什么。我一直在使用会话来填充信息,但是如果用户阻止cookie,这就不够了。我已经考虑过将它传递到HTTP GET变量中,但我不确定它是否是一个好的选择,因为它的长度受到一些浏览器的限制 您喜欢哪种方法?您可以尝试使用错误消息的索引列表,然后将错误ID作为GET参数传递给页面。您不能真正使用POST,因为我认为您将重定向到错误页面,因此GET请求几乎是您的最佳选择 另一种方法是将错误页面放在原位,即用户停留在同一URL上,但会获得修改后的HTTP状态码(即404表
您喜欢哪种方法?您可以尝试使用错误消息的索引列表,然后将错误ID作为GET参数传递给页面。您不能真正使用POST,因为我认为您将重定向到错误页面,因此GET请求几乎是您的最佳选择 另一种方法是将错误页面放在原位,即用户停留在同一URL上,但会获得修改后的HTTP状态码(即404表示“未找到”,500表示服务器错误等)以及错误消息。这样,您就不必担心通过HTTP请求填充页面,您只需在遇到错误的页面中进行操作
我更喜欢第二种方法,即使它更难实现。有了它,您就可以使用错误和异常处理程序自动捕获任何错误情况,然后发出错误输出代码。有些通知属于生成它们的页面,例如表单字段中的错误。这些很容易处理。我通常创建一个数组以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: 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
ID:4A0A19218E082A343A1B17E533409AF9D98F0F5
日期:2010-05-2511:24:30
类型:消息
HTML:已成功修改。
http://example.com/?msg=4a0a19218e082a343a1b17e5333409af9d98f0f5
确保保存日期,以便随时清理旧数据
我的两分钱。还有可能将PHP会话id附加到页面上的每个链接,因此如果Cookie失败,您可以返回到该链接
如果不可能,我也会将消息保存到数据库中,并使用$_GET传递唯一id。对于允许传递的数据类型(例如页面上显示的文本字符串),要非常小心,因为这可能会让您面临xss攻击—例如,如果有人更改url,使其传递