处理从 PHP JavaScript (AJAX) 返回的数据的最正确/最友好的方法是什么?
What's the most proper/friendly way to handle returned data from PHP JavaScript (AJAX)?
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 文件分配成功。
希望这对你有帮助。
- 打破承诺链的好方法是什么
- 在JavaScript中拆分日期字符串的更好方法是什么
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- 基于窗口宽度jquery的函数的替代方法是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- knex:根据结果创建数组的合适方法是什么
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- node.js是否具有'match()'方法如果是,语法是什么
- 使用Modernizr检测移动设备最可靠的方法是什么
- 确定var是否是javascript中的elementFinder对象的方法是什么
- 用javascript修复这个JSON对象字符串最干净的方法是什么
- 让会话值可用于JavaScript的好方法是什么
- 从AngularJs获取谷歌地图对象的正确方法是什么
- 使用ReactJS和Flux架构从服务器获取数据的正确方法是什么
- 列出没有 mysql 的元素的最佳方法是什么
- 克服错误的更优雅的方法是什么:需要对象说明符.当通过JXA通过Messages发送SMS时,参数没有对象说明符
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 在 Javascript 中实现解耦代码/回调的正确方法是什么?
- 使用Javascript,获取元素的方法是什么,基于打开和关闭标记之间的文本