Какой самый правильный / удобный способ обработки возвращаемых данных из PHP JavaScript (AJAX)?
РЕДАКТИРОВАТЬ: Хорошо, теперь, когда я думаю об этом, JSON звучит достойно для этого, и пока я правильно кодирую, не должно быть синтаксической ошибки, чтобы нарушить его или что-то еще.
Добрый вечер!
Меня всегда беспокоило то, как обрабатывать возвращенные данные из PHP в запросе AJAX и как даже вернуть данные!
Скажем, у меня есть форма входа в систему, и она обрабатывает отправленные данные формы через AJAX. Мы скажем, что мы используем GET для простоты.
"Page.php? Имя пользователя =Foo& пароль = бар"
Вот что меня беспокоит / раздражает, и почему я чувствую себя навязчивым и чувствую, что мне нужно знать правильный способ сделать это:
Я отправил данные, и они были обработаны. Что теперь?
Скажите, что мое имя пользователя и пароль верны / верны. Что я делаю?
Вернуть истину в PHP? Строка?
Тогда что мне делать с 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...
}
Но что, если моя комбинация имени пользователя и пароля неверна? Вернуть ли мне false через PHP или снова строку?
Между true и false есть только 2 варианта: 1. Имя пользователя и пароль были правильными 2. Имя пользователя и пароль были неправильными
Но что, если имя пользователя даже не существует? Возвращение "false" не помогает мне точно сказать клиенту, почему он не может войти в систему.
Погрузившись глубже в мое ОКР, можно сказать, что насчет неожиданных ошибок или ошибок разбора?
Если есть какая-то ошибка соединения с БД или ошибка синтаксического анализа, как мне вернуть это, чтобы сообщить пользователю? Я посмотрел в Trying... и Catching синтаксические ошибки, но мне не повезло.
Недавняя мысль, которую я имел, должна была сделать ЭТО:
Если все выполняется правильно, и имя пользователя и пароль существуют (возвращаясь к нашему первоначальному сценарию), то мы НИЧЕГО не возвращаем. ResponseText будет пустой строкой. Это означает, что пользователь успешно вошел в систему!
В противном случае, если есть ошибка, верните что-то (обычно строку) и отобразите ее как ошибку.
Я иду об этом правильным путем? Я на правильном пути?
3 ответа
Мое личное предпочтение, которое никоим образом не является "правильным" способом сделать это, состоит в том, чтобы использовать 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":true}
само по себе, но иногда здесь есть и дополнительные данные.
Как я уже сказал, это не "THE" способ сделать это, но мне это нравится, и это соответствует.
РЕДАКТИРОВАТЬ: Забыл упомянуть немного об ошибках PHP.
JavaScript, который получает ответ сервера, пытается проанализировать его как JSON, используя try...catch
блок. Если синтаксический анализ не удался, произошла ошибка сервера. В таком случае выдается сообщение об ошибке с необработанным ответом от сервера с примечанием, предлагающим пользователю связаться со мной по поводу сообщения об ошибке.
Я думаю, что вы слишком усложняете себя ответом "если и".
Ниже приведен старый пример, который я использовал один раз. я использую следующий ajax для отправки имени пользователя / пароля в php файл через AJAX
$.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;
Хотя я запрашивал только пароль для имени пользователя, существует, вы можете применить аналогичную проверку в другом случае. затем передайте эти значения обратно в jquery в формате json.
Вы можете использовать все значения, назначенные в php, как я делал выше в строке:
if(data.success=='y') {
где успех назначен из файла php.
Надеюсь, это поможет вам.
Довольно распространенный шаблон для этого - возвращать массив ошибок, который может быть объектом JSON в вашем случае. Если массив ошибок пуст, вы можете перейти, а если нет, отобразите ошибку своему пользователю.