2

どういうわけか私は自分自身を混乱させました。

どういうわけか、PHPをAJAX($ .postなど)でヒットすると、true / falseを返すのではなく、「true」または「false」をエコーバックする必要があることに気づきました。今はそうではないようですが、誰かが私のためにそれを分解することはできますか?

ブール値のテストに問題があるということですか?ここみたいに

... 
$.post('ajax/doThing',{data: data},
    function(response) {
        if(response) {
            doThis();
        }else{
            doThat();
        }

それが問題のケースですよね?ここではtrue/falseを返すことはできません。代わりに、文字列をエコーバックして文字列をテストする必要があります。

if(response === "true")

しかし、ブール値のtrue/falseがajax関数に返されるのを見てきました。AJAX側でブール値をテストできない場合、これの用途は何ですか?そして、なぜajaxはブール値をテストできないのですか?

それとも私はまだ混乱していますか?

編集

これについての良い答えをみんなに感謝したかっただけです。私は今+2smrterです。

4

4 に答える 4

6

また、リクエストが実際には成功しなかった場合に「成功」​​応答 (HTTP ステータス コード 200) を返すのではなく、HTTP エラー コードを返すことを検討し、errorコールバックを使用して失敗したリクエストを処理することもできます。

しかし、ステータス コード 200 を使い続けたい場合 (多くの人がそうしています):

クライアントとサーバー間で転送されるデータは常にテキストです。秘訣は、クライアントとサーバーが、クライアントがテキストを逆シリアル化する方法 (受信時に変換する方法) について合意していることを確認することです。通常、次の 4 つのいずれかを返します。

  1. HTML (ページ要素に入力する場合)

  2. JSON (クライアントにデータを送信するための軽量で高速な方法が必要な場合)

  3. XML (クライアントにデータを送信するためのより重い、高速な方法が必要な場合)

  4. プレーンテキスト(本当に欲しいものは何でも)

Content-Typeクライアントの動作は、PHP ページで使用するヘッダーによって異なります。

私の推測では、データを文字列としてコールバックに渡すいくつかのコンテンツ タイプのいずれかを使用していると思います。文字列"true"は真ですが、文字列もそうです (空の文字 "false"列のみが偽です)。

簡単に言えば、私はおそらくこれをPHPで使用するでしょう:

header('Content-Type', 'application/json');

...そしてそれからこのテキストを返します:

{"success": true}

また

{"success": false}

...そして、成功ハンドラで:

if (response.success) {
    // It was true
}
else {
    // It was false
}

Content-Typeまたは、 ofを返してtext/plain使用することもできます

if (response === "true") {
    // It was true
}
else {
    // It was false
}

...しかし、それは、インフラストラクチャにそれを実行させることができる手動デシリアライズのようなものです。

于 2013-02-05T13:11:54.317 に答える
4

スクリプトは、このような比較を可能にするために、PHP 変数に相当する JavaScript に変換される応答を返すか、HTTPステータス コードを使用してエラー状態を伝える必要があります。

応答処理

jQuery.ajax()友人は、送信した応答ヘッダー (XML、JSON など) に基づいて (デフォルトで自動的に) 応答を解釈します。

以下のコードは、JSON 形式の応答を出力します。

header('Content-Type: application/json');
echo json_encode(array(
    'success' => true,
));

ブラウザーに送信される出力は次のようになります。

{"success": true}

成功ハンドラー内で、次のコードを使用できるようになりました。

if (response.success) { ... }

エラー処理

jQuery.ajax()通常以外の HTTP ステータス コード レスポンスも処理できます200 OK。例:

header('404 Not found');
exit;

これにより、エラー ハンドラーが呼び出されます。

$.ajax({
    url: ...,
    error: function(xhr, status, msg) {
      // xhr - see http://api.jquery.com/jQuery.ajax/#jqXHR
      // status - "error"
      // msg - "Not found"
      alert('Error code ' + xhr.code + ' encountered');
    }
});
于 2013-02-05T13:08:53.367 に答える
3

Ajax 呼び出しは、スクリプトによって返されるテキストを想定しています。php bool を返す場合、テキストは出力されないため、「何か」をエコーする必要があり、「true」または「false」である必要はありません。

于 2013-02-05T13:09:23.960 に答える
3

すべてはサーバーの応答に依存します。適切な MIME タイプを使用すると、jQueryが自動的JSON.parse()に応答して、ブール値trueをコールバックに渡します。JSON を認識しない場合は、"true"比較する必要があるテキスト結果を渡します。


// PHP:
header('Content-Type', 'application/json');
echo true; // or "true" or json_encode(true)

// JavaScript (with jQuery.ajax):
… function callback(response) {
    typeof response; // "boolean"
    if (response) {…}
} …

// PHP:
header('Content-Type', 'text/plain'); // or similar, also implicit
echo "true";

// JavaScript (with jQuery.ajax):
… function callback(response) {
    typeof response; // "string"
    if (response == "true") {…}
} …
于 2013-02-05T13:11:26.530 に答える