0

编辑:好的,现在我想起来了,JSON 听起来确实不错,只要我编码正确,就不应该有语法错误来破坏它或任何东西。


晚上好!

一直困扰我的是如何在 AJAX 请求中处理从 PHP 返回的数据,以及如何返回数据!

假设我有一个登录表单,它通过 AJAX 处理提交的表单数据。为了简单起见,我们会说我们使用 GET。

"page.php?username=Foo&password=bar"

以下是我的错误/烦恼,以及为什么我会感到强迫并感觉好像我需要知道正确的方法来做到这一点:

我发送了数据,它已被处理。怎么办?

假设我的用户名和密码有效/正确。我该怎么办?

在 PHP 中返回true ?一个字符串?

那么我该如何处理 JavaScript 呢?

   if(ajaxRequest.responseText=="true"){
       //Username and password are correct! Execute this...
   }

我认为一个很酷的想法是将 JSON 对象作为字符串返回,并通过 JavaScript 进行解析。

  var object=JSON.parse(ajaxRequest.responseText);
  if(object.success=="true"){
       //Username and password are correct! Execute this...
   }

但是,如果我的用户名和密码组合是……错误怎么办?我是通过 PHP返回false还是再次返回字符串?

truefalse之间,只有 2 个选择: 1. 用户名和密码正确 2. 用户名和密码不正确

但是如果用户名甚至不存在怎么办?返回“false”并不能帮助我告诉客户他们无法登录的确切原因。

深入了解我的强迫症,意外或解析错误呢?

如果存在某种 DB 连接错误或解析错误,我该如何返回以告诉用户?我调查了 Trying...and Catching 语法错误,但我没有运气。

我最近的一个想法是这样做:

如果一切正常执行,并且用户名和密码存在(回到我们原来的场景),那么我们不会返回任何东西。responseText 将是一个空字符串。即表示用户登录成功!

否则,如果出现错误,请返回某些内容(通常是字符串)并将其显示为错误。

我会以正确的方式解决这个问题吗?我在正确的轨道上吗?

4

3 回答 3

3

我个人的偏好,绝不是“正确”的做法,是对所有事情都使用 JSON。

所以我有一个 JavaScript 函数,当提交表单时,它将表单数据转换为 JSON 字符串并将其 POST 到服务器。

然后服务器对其进行处理,并返回另一个 JSON 对象。因此,在您的登录示例中,服务器将收到:

{"username":"Foo","password":"bar"}

它会返回其中之一:

{"ok":false,"error":"No user with that name was found."}
{"ok":false,"error":"The password you entered was incorrect."}
{"ok":false,"error":"Failed to log you in (error code: ###)"}
{"ok":true,"redirect":"/home"}

每个 AJAX 请求响应都有这个“ok”属性。如果它是假的,就会有一个“错误”属性说明发生了什么(根据情况可能会有额外的数据)。成功时,“ok”属性为真。很多请求{"ok":true}都是自己得到的,但有时这里也有额外的数据。

正如我所说,这不是“THE”的方式,但我喜欢它并且它是一致的。

编辑:忘了提及有关 PHP 错误的信息。

接收服务器响应的 JavaScript 尝试使用try...catch块将其解析为 JSON。如果解析失败,则存在服务器错误。在这种情况下,会弹出一条错误消息,其中包含来自服务器的原始响应,并附注建议用户就错误消息与我联系。

于 2013-11-11T11:12:17.513 回答
0

一个相当常见的模式是返回一个错误数组,在您的情况下它可能是一个 JSON 对象。如果错误数组是空的,你就可以走了,如果不是,那么向你的用户显示错误。

于 2013-11-11T11:07:22.733 回答
0

我认为您对响应的如果和但是过于复杂了。

以下是我曾经使用过的一个旧示例。我正在使用以下 ajax 通过 AJAX 将用户名/密码发送到 php 文件

$.ajax({
    type: "POST",
    url: SITE_URL+"ajax_files/ajax_login.php",
    data: dataString,
    dataType: "json",
    cache: false,
    success: function(data){
        if(data.success=='y') {
            window.location.href='index.php';
        } else {
            $('#messagesnormal').hide();
            //Show results div
            $('#resultsAjax').show();
            //Put received response into result div
            //$('#resultsAjax').html(data.msg);
        }
    }
});

以下是我的 php 文件代码。

header('Content-Type: application/json');
include("../config/config.php");
$username = trimdata($_POST['username']);
$password = trimdata($_POST['password']);
$r = $db->select("SELECT * FROM users where email = '".dbAddslashes($username)."' and password='".dbAddslashes($password)."' and status = '1' and locked_by_admin = '0'");
if($db->row_count > 0) {
    while ($row=$db->get_row($r, 'MYSQL_ASSOC')) {
       $_SESSION["userdata"]["userid"]  = $row['user_id'];
       $_SESSION["userdata"]["usertype"] = $row['type'];
       $_SESSION["userdata"]["useremail"] = $row['email'];
       $_SESSION["userdata"]["name"] = $row['name'];
       if($_SESSION["userdata"]["usertype"]=='1') {
            $_SESSION["userdata"]["userrole"] = 'admin';
       } else {
            $_SESSION["userdata"]["userrole"] = 'user';
       }
       $_SESSION["userdata"]["last_login"] = $row['last_login'];
       $_SESSION["userdata"]["last_login_ip"] = $row['last_login_ip'];
       $success = 'y';
       $msg = 'login successfull';

       /*Insert login time and IP*/
       $data = array('last_login' => time(), 'last_login_ip' => getRealIPAddr());
       $rows = $db->update_array('users', $data, "user_id=".$row['user_id']);

       print json_encode(array('success' => $success, 'msg' => $msg));
       exit;
    }
} else {
    $success = 'n';
    $msg = '<div class="gagalsmall">Invalid credentials.Please try again.</div>';
    print json_encode(array('success' => $success, 'msg' => $msg));
    exit;
}
exit;

虽然我只查询了两个用户名密码是否存在,但您可以在不同的场合应用类似的检查。然后将这些值以 json 格式传递回 jquery。

您可以使用 php 中分配的所有值,就像我在上面在线所做的那样:

if(data.success=='y') {

从 php 文件分配成功的位置。

希望这对您有所帮助。

于 2013-11-11T11:11:10.710 回答