存储在SESSION中的错误消息

时间:2010-11-29 10:50:29

标签: php session

SESSION中存储错误消息是一种好习惯吗?例如,重定向后。通过网址传入不是我的解决方案...... 我想知道这是否是一个很好的解决方案......因为..

请问提交者是否提交了用户原因问题? (很长一段时间的帖子,而ajax内容是从另一个标签获得的)可能搞乱会话!或者这是不可能发生的?

如果用户发出请求并且由于某种原因导致显示页面失败,则该消息可能会显示在不相关的页面上!

所以?任何替代品??
例如,使用POST /重定向/获取模式时

7 个答案:

答案 0 :(得分:7)

在会话中存储错误消息时,必须注意,在显示之前,两个请求不会覆盖其他消息。而且你必须小心,一个应该显示消息的页面只显示它自己的消息。

您应该在出现错误时显示错误,而不是之前重定向。在这种情况下也没有理由重定向。

答案 1 :(得分:4)

  

在SESSION中存储错误消息是一种好习惯吗?例如,在重定向之后。

不一般。会话数据应该是重要时期内重要的数据,错误通常是单个请求的结果,并且细节不需要持久。

在会话中存储这类数据只是对竞争条件的邀请。

答案 2 :(得分:2)

为什么不给他们分配一个像error_id = 2这样的特定ID并通过url发送它们? 或者这在你的情况下是不可能的? 您还可以通过会话发送错误ID ...

答案 3 :(得分:1)

在会话中存储错误消息并不罕见,尤其是在可能存在多个重定向的情况下。 Zend框架有类似flash messenger的东西。

会话中的任何内容都将保留在会话中,直到您销毁它或会话超时。最佳实践是将错误消息存储在会话中,然后当页面加载到需要显示错误消息的位置时,您的代码将从会话中获取消息并显示它们(如果存在)。显示错误消息后,您需要从会话中删除它们,否则每次用户转到此页面时,都会看到一次又一次弹出相同的错误消息。

最好的方法是显示和删除。

我相信如果你使用这种方法,你不应该遇到任何问题。原因是如果提交了不正确的表单,它将始终存在错误,它将始终尝试将这些错误消息存储在会话中并相应地显示它们在会话中添加/删除的次数无关紧要。我希望这一切都有道理。

此外,当您存储会话错误消息时,您需要巧妙地存储它们,以便后端知道这些错误消息是以哪种形式存储的。

答案 4 :(得分:1)

关注用户!您的所有开发工作都希望尽可能提供最佳用户体验。

第一个问题是,为什么你需要消息?

  • 如果成功请求,您希望用户知道他的请求已成功执行。
  • 如果出现错误请求,您可以区分:如果用户更改请求变为成功请求,则显示有用的错误消息(例如简单的表单提交)。如果用户不能更改请求,请尽可能提供信息为什么请求失败(例如“无法执行,因为服务XY不可用。请联系支持等。”)。< / LI>

简单:错误的请求可能会被更改:

如果用户可能会更改请求的错误请求,请不要将其保存在会话中,直接呈现用户可以更正其请求的页面。

困难:成功请求或错误请求可能不会改变:

在这里,您通常希望用户在点击F5或执行类似操作后无法再次执行完全相同的请求,因此您可以重定向用户。在这种情况下,我个人赞成使用Flash消息组件的解决方案(例如,请参阅Symfony DocsZend Docs)。一般而言,如果您的应用程序满足以下假设,此技术不会导致竞争条件:

  • 您从浏览器触发的HTTP请求会快速执行。在此期间,用户没有真正的机会解雇第二个请求。
  • 您的AJAX调用不会影响Flash消息 - 或者,如果您返回结构化数据(XML,JSON),您可能会包含一个特殊的Flash消息部分,然后由Javascript呈现。

现在,为了最大限度地降低错误率,您可以执行以下操作:

  • 存储添加Flash消息时的时间戳。不显示旧消息(例如> 1分钟)。移动用户可能会断开连接,然后重试。他希望该申请处于什么状态?
  • 不要让用户和服务器之间的HTTP请求花费很长时间。如果您需要执行长计算,请尝试将事情卸载给后台工作人员并向用户显示处理状态。

总结:如果您有关于HTTP通信的一般良好做法,那么用户不太可能能够搞乱Flash消息。权衡利弊,关注用户,而不是实施的复杂性,因为有方法可以解决这个问题。

答案 5 :(得分:0)

一般来说:

尝试尽可能多地放在客户端(javascript和cookie)并尝试在服务器端尽可能少地存储。

这包括SESSION变量,在最佳方案中应该只包含用户ID。

如果邮件是在重定向之后,您可以添加一个请求变量,该变量可以为邮件编制索引并以此方式显示。

答案 6 :(得分:-1)

您可以在URL中传递错误代码,而不是存储在会话中,然后您可以使用该错误代码来查找错误。我为这种事情提供了用户简单的异常类:

class MyException extends Exception
{
    const USER_NOT_FOUND = 'The requested user was not found';
    // ...
}

然后您的重定向网址会像/controller/action/error/USER_NOT_FOUND那样,您可以使用它来查找消息:

echo constant('MyException::' . $error);

您不需要使用Exception课程,但它可以让您保持整洁

if ($errorState) {
    throw new MyException(
        MyException::USER_NOT_FOUND
    );
}