处理从 PHP JavaScript (AJAX) 返回的数据的最正确/最友好的方法是什么?

What's the most proper/friendly way to handle returned data from PHP JavaScript (AJAX)?

本文关键字:是什么 方法 数据 JavaScript PHP AJAX 返回 处理      更新时间:2023-09-26

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


晚上好!

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

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

"page.php?用户名=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 还是再次返回字符串?

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

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

更深入地了解我的强迫症,意外或解析错误怎么办?

如果存在某种数据库连接错误或解析错误,如何返回它以告诉用户?我研究了尝试...和捕获语法错误,但我没有运气。

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

如果一切都正确执行,并且用户名和密码存在(回到我们的原始场景),那么我们不会返回任何内容。响应文本将是一个空字符串。这意味着用户已成功登录!

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

我这样做的方式是否正确?我走在正确的轨道上吗?

我个人的偏好,绝不是"THE"正确的方法,是对所有内容都使用 JSON。

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

然后,服务器对其进行处理,并返回另一个 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"属性。如果为 false,则会有一个"error"属性说明发生了什么(并且根据情况可能会有其他数据)。成功时,"ok"属性为真。许多请求只是单独{"ok":true},但有时这里也有额外的数据。

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

编辑:忘了提到关于PHP错误的一点。

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

一个相当常见的模式是返回一个错误数组,在您的情况下,这可能是一个 JSON 对象。如果错误数组为空,则很好,如果不是,则向用户显示错误。

我认为你对反应的if和buts过于复杂了。

以下是我使用过一次的旧示例。 我正在使用以下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 文件分配成功。

希望这对你有帮助。