0

EDIT:さて、考えてみると、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」を返すことは、クライアントがログインできない理由を正確に伝えるのに役立ちません.

これについて私の OCD を深く掘り下げると、予期しないエラーや解析エラーはどうなりますか?

ある種の DB 接続エラーまたは解析エラーがある場合、それを返してユーザーに伝えるにはどうすればよいですか? Trying... and Catching 構文エラーを調べましたが、うまくいきませんでした。

私が持っていた最近の考えは、これを行うことでした:

すべてが適切に実行され、ユーザー名とパスワードが存在する場合 (元のシナリオに戻ります)、何も返しません。responseText は空の文字列になります。これは、ユーザーが正常にログインしたことを意味します。

それ以外の場合、エラーが発生した場合は、DOが何か (通常は文字列) を返し、それをエラーとして表示します。

私はこれを正しい方法で行っていますか?私は正しい軌道に乗っていますか?

4

3 に答える 3

3

私の個人的な好みは、決して「THE」正しい方法ではありませんが、すべてに JSON を使用することです。

そのため、フォームが送信されると、フォーム データを JSON 文字列に変換してサーバーに POST する JavaScript 関数があります。

サーバーはそれを処理し、別の 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 の場合、何が起こったかを示す "エラー" プロパティが表示されます (状況によっては、追加のデータが表示される場合もあります)。成功すると、「ok」プロパティが true になります。多くのリクエストは{"ok":true}それ自体で取得されますが、追加のデータがここにある場合もあります。

私が言ったように、これはそれを行う「THE」方法ではありませんが、私はそれが好きで、一貫しています.

編集: PHP エラーについて少し言及するのを忘れていました。

try...catchサーバーの応答を受け取る JavaScript は、ブロックを使用して JSON として解析しようとします。解析に失敗した場合は、サーバー エラーが発生しています。このような場合、サーバーからの生の応答と共にエラー メッセージがポップアップ表示され、エラー メッセージについて私に連絡するようユーザーにアドバイスするメモが表示されます。

于 2013-11-11T11:12:17.513 に答える
0

これのかなり一般的なパターンは、エラー配列を返すことです。これは、あなたの場合は JSON オブジェクトである可能性があります。エラー配列が空の場合は問題ありません。そうでない場合は、ユーザーにエラーを表示します。

于 2013-11-11T11:07:22.733 に答える
0

応答の 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ファイルから割り当てられます。

これがお役に立てば幸いです。

于 2013-11-11T11:11:10.710 に答える