将数据传递到通知页面

时间:2010-05-25 08:46:58

标签: php error-handling

我不确定填充通知页面的最佳方法是什么。我一直在使用会话来填充信息,但如果用户阻止cookie,则会出现这种情况。我已经考虑过在HTTP GET变量中传递它,但我不确定它是否是一个很好的选择,因为它的长度受到某些浏览器的限制。

您更喜欢哪种方式?

3 个答案:

答案 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。