【问题标题】:AJAX and PHP returning bool and stringAJAX 和 PHP 返回 bool 和 string
【发布时间】:2016-12-29 02:12:21
【问题描述】:

我有一个基于 ajax 的脚本,它纯粹是为了运行 php 脚本来验证用户身份而设计的。与用户身份验证一样,可能会出现以下两种结果之一:要么通过身份验证,要么不通过。
要在调用它的页面上表示成功或失败非常简单,您只需 echo ‘success’; 或相应地'echo'failure'' 并让 JS/jQuery 脚本通过响应字符串处理它。 (或者至少我认为这是很好的做法..)

但除了本质上返回 true 或 false 之外,如果它返回 false,我还想返回一条消息,说明它失败的原因。用户存在吗?密码不正确吗?还是数据库访问出错了,需要吐出技术错误码。由于我们已经在以真或假进行响应,因此我们不能将消息与虚假陈述一起发回,否则从技术上讲它不是虚假的,因为有更多数据。

现在我有了这些想法,但我觉得有更好的方法来做到这一点:

  • 返回一个数组 [true/false, “String to display”],尽管这在 PHP 文件中看起来很笨重,并且还在页面上解析它
  • 当我们想要返回 true 时返回 success,并将其他任何内容标记为失败并假设它是失败的消息

但老实说,我觉得整个文本响应方法很糟糕,尤其是对于像用户身份验证这样的事情,因为它可能很容易被欺骗(?)那么推荐的方式来实现这样的事情呢?

提前致谢!

【问题讨论】:

  • 你可以用JSON轻松搞定
  • 任何东西都可以在客户端被欺骗。这就是为什么会话存在于服务器端的 PHP 中。您发送的内容以及在客户端如何解析它完全取决于您的技能和品味,但我也建议使用 JSON,因为它更容易处理/维护。注意:如果用户不存在或密码错误(提供更多破解选项),我永远不会明确告诉用户,我只会说wrong credentials
  • 如果您想了解有关最佳实践的更多信息,请查看现有的 PHP 框架以了解它们是如何做到的。例如,Laravel 刚刚添加了一个功能来限制身份验证请求:By default, the user will not be able to login for one minute if they fail to provide the correct credentials after several attempts. The throttling is unique to the user's username / e-mail address and their IP address.laravel.com/docs/5.2/authentication#authentication-throttling
  • 一个很好的起点:stackoverflow.com/questions/549/…
  • @bansi 就会话而言,这一切都在 PHP 上使用会话 ID、cookie 和一大堆其他验证进行处理,因此即使用户欺骗客户端以通过登录窗口,它由于一次狡猾的会议,他们会直接吐回去。此外,我从不说没有用户或密码错误,但在某些情况下,除了“帐户未激活”或“帐户已被禁止 x 时间”等不良凭据外,我还需要显示另一条消息。这些是我认为重要的案例,不仅要返回失败,还要返回一条消息。

标签: php ajax


【解决方案1】:

这纯粹是基于意见,但我认为您在处理 PHP(服务器)和 Javascript(客户端)等两个系统之间的通信时缺少两个重要概念。

第一,评估响应代码。如果 HTTP 响应码为 200 表示 OK,201 表示创建了资源(可能是会话),401 表示用户未授权。鉴于此,仅通过 HTTP 响应,您应该能够判断操作是否成功。

二,使用 JSON 或标记语言。您可以传递 JSON 字符串以包含状态和消息,并在 Javascript 中解析 JSON 字符串。

PHP 中的示例是:

http_response_code(401);
$response = [ 
'success' => false,
'message' => 'Password incorrect'
];
echo json_encode($response);

【讨论】:

  • 措辞出色的答案。
  • @Darren 我应该让 jQuery 接收响应代码吗?
  • @SteppingHat,jQuery 会自动将 2XX 代码解释为成功,将 4XX 解释为失败(分别为 .done() 和 .fail())。您还可以根据具体的状态码更改操作:api.jquery.com/jquery.ajax。这不仅仅是 JQuery,HTTP 响应代码对任何集成都很有用。
  • 那么我什至需要将响应作为数组返回吗?如果 jQuery 可以通过响应代码解释成功或失败,为什么我不能自己回显消息?
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多