Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将数据传递到通知页面_Php_Error Handling - Fatal编程技术网

Php 将数据传递到通知页面

Php 将数据传递到通知页面,php,error-handling,Php,Error Handling,我不确定填充通知页面的最佳方式是什么。我一直在使用会话来填充信息,但是如果用户阻止cookie,这就不够了。我已经考虑过将它传递到HTTP GET变量中,但我不确定它是否是一个好的选择,因为它的长度受到一些浏览器的限制 您喜欢哪种方法?您可以尝试使用错误消息的索引列表,然后将错误ID作为GET参数传递给页面。您不能真正使用POST,因为我认为您将重定向到错误页面,因此GET请求几乎是您的最佳选择 另一种方法是将错误页面放在原位,即用户停留在同一URL上,但会获得修改后的HTTP状态码(即404表

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


您喜欢哪种方法?

您可以尝试使用错误消息的索引列表,然后将错误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
  • 无聊的用户可以享受通过有趣的错误消息分发链接的乐趣:
如果您有一些可用的存储(文件、数据库等),您可以保留完整的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
ID:4A0A19218E082A343A1B17E533409AF9D98F0F5
日期:2010-05-2511:24:30
类型:消息
HTML:已成功修改。
http://example.com/?msg=4a0a19218e082a343a1b17e5333409af9d98f0f5
确保保存日期,以便随时清理旧数据


我的两分钱。

还有可能将PHP会话id附加到页面上的每个链接,因此如果Cookie失败,您可以返回到该链接


如果不可能,我也会将消息保存到数据库中,并使用$_GET传递唯一id。

对于允许传递的数据类型(例如页面上显示的文本字符串),要非常小心,因为这可能会让您面临xss攻击—例如,如果有人更改url,使其传递