1

この特定の AJAX 呼び出しは、responseText によって返される値の前に「\n」を返しています。

以前はそれを行っていませんでしたが、if (request.responseText == 100)現在は「\n100」に等しいため、有効な戻りコードをテストすると失敗します。

「\n」を削除できることはわかっていますが、それは回避策であり、原因を見つけて修正することをお勧めします。

クライアント側のコードは次のとおりです。

function AJAX(){

    var xmlHttp;

    try{
        xmlHttp=new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari
        return xmlHttp;
    }
    catch (e){
        try{
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
            return xmlHttp;
        }
        catch (e){
            try{
                xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                return xmlHttp;
            }
        catch (e){
            alert("Your browser does not support AJAX!");
            return false;
        }
        }
    }
}


function logDetails() {

    var request,
        Result  = document.getElementById('Result'),
        message = document.getElementById('message'),
        url = 'ajax/login.user.php?',
        us  = document.getElementById('username').value,
        pa  = document.getElementById('password').value;

    Result.innerHTML = 'Logging in...';

    if (document.getElementById) {

        request = AJAX();

    }

    if (request) {

        request.onreadystatechange = function() {

            if (request.readyState == 4 && request.status == 200) {

                var r = request.responseText;
//var r = 100;
                if (r == '100') {

                    Result.innerHTML        = 'You are now logged in.';
                    window.location.href    = "prebooks.php";

                }

                else if (r == '101' || r == '102') {

                    Result.innerHTML    = 'Your login attempt failed.';
                    resetDetails();

                }

                else if (r == '103') {

                    Result.innerHTML    = 'Sorry, you have no books subscription.';

                }

                else if (r == '999') {

                    Result.innerHTML    = 'You have no more attempts!';
                    message.innerHTML   = 'Please call us on (02) XXXXXXX so that we can assist you.';

                } else {

                    alert(r);

                }
            }
        };
    }
    // add my vars to url
    url += "arg1="+us+"&arg2="+pa;

    request.open("GET", url, true);
    request.send(null);
}

これが私のサーバー側のコードです:

<?= 100 ?>

わかりました、単純化しましたが、「100」を直接エコーしようとしましたが、問題は残ります。

更新 「100」を直接エコーしても問題が解決しないと誤解されました。します。申し訳ありませんが、私を正しい方向に向けてくれてありがとう。

ただし、これにより、サーバー側で出力がどのように汚染されているかを見つけようとする必要があります。

サーバー側には、認証を処理し、エコーされる値 (100) を返すクラスがあります。これは行です:

echo $L->doLogin($pkg);

メソッドのリターンに関連する行は次のdoLogin()とおりです。

$pkg[status]=100;
return $pkg[status];

そして、改行が機能する場合、どこかで改行が漏れていないことを確認してecho $L->doLogin($pkg);くださいecho 100;

更新 2 - 解決済み doLogin() メソッド内に含まれているクラス ファイルに問題があったことが判明しました<?

ご意見をお寄せいただき、ありがとうございます (この情報がなければ、クライアント側のコードをいまだに手探りしていたでしょう)。

4

2 に答える 2

0

私は同じ問題を抱えていて、(文字列化された JSON が返されたことを示すアラートで Ajax に dataFilter オプションを追加することによって) 発見したのは、実際には構文の問題を抱えていた PHP スクリプトでした。PHP サーバーは、エラーを通知するために HTML ミニドキュメントを事前に保留していました。しかし、AJAX に戻ると、dataType が 'json' だったので、返された PHP 応答全体が最初に json 解析されたため、先頭に追加されたすべての HTML が取り除かれ、改行だけが残りました。有効な JSON 返されたデータの前にあるこれらの改行により、JSON データが構文エラーと見なされていました。アラートで生データを送信する dataFilter オプションを使用すると、PHP スクリプトの初期エラーを確認できました。修正すると、改行が前に追加されることはなくなりました。

于 2013-07-17T06:58:50.357 に答える