Какой самый правильный / удобный способ обработки возвращаемых данных из 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 в вашем случае. Если массив ошибок пуст, вы можете перейти, а если нет, отобразите ошибку своему пользователю.

Другие вопросы по тегам