-1

環境: PH​​P 5.3.5 MySQL サーバー 5.5.8、jquery バージョン 1.6

Ajax を使用して、国のドロップダウン リストを自動入力します。

このエラーが発生し続け、多くのことを試しました。エンコードする前に $results を "'$results'" で囲むなど。エラーは引き続き発生します。

出力の例を次に示します。

array(1) {
  [0]=>
  array(4) {
    ["id"]=>
    string(2) "45"
    [0]=>
    string(2) "45"
    ["nicename"]=>
    string(16) "Christmas Island"
    [1]=>
    string(16) "Christmas Island"
  }
}

これがajaxです(成功を完了に変更しようとしました-そうすると、エラーコードが複製されます.

$.ajax({
    type: "POST",
    url: "models/ajaxHandler.php",
    data: {handler:"getCountries", nli:"-1"}, 
    dataType: "json",
    success: function(results){
        //results = $.parseJSON(results);
        var resultStr = "";

        for(var x in results)
            resultStr = resultStr + results[x]; 
        alert("RESULT" + resultStr);


        //populateDropDown(results);
    },
    error: function(xhr, status, error){
        alert(xhr+ "| ajax failure: could not populate list of countires | " + status + " | error:" + error);
        var xhrStr = "";
        for(var x in xhr)
            xhrStr = xhrStr + xhr[x];
        alert(xhrStr);
    }
});

php で json 文字列をエンコードした後、次のような特殊文字をエスケープしています。

if (!empty($results)){
        $json = json_encode($results);
        //$json = form_safe_json($json);
        echo $json;
}

function form_safe_json($json) {
            $json = empty($json) ? '[]' : $json ;
            $search = array('\\',"\n","\r","\f","\t","\b","'") ;
            $replace = array('\\\\',"\\n", "\\r","\\f","\\t","\\b", "\'");
            $json = str_replace($search,$replace,$json);
            return $json;
}
4

3 に答える 3

3

PHPでjson文字列をエンコードした後、特殊文字をエスケープしています

それを行う必要はありません --json_encode()必要なすべてのエスケープを行います。実際、そうすることで、生成された有効な JSON が壊れる可能性がありjson_encode()ます。

[編集]

明確にするために: PHP のjson_encode()関数は、任意の入力から有効な JSON を生成します。(テストする必要があるのはfalse失敗した場合だけですが、空の文字列は有効な JSON であるため、エコーすると jQuery で正しく解析されます)。

プログラムが の出力のみをエコーする場合、プログラムjson_encode()は有効な JSON を提供し、JS コードで JSON 解析エラーを取得しません。

プログラムが他のものをエコーする場合、または JSON 文字列を送信する前に変更すると、エラーが発生する可能性があります。

注意事項:

  • を複数回呼び出して、複数の JSON 文字列を次々に送信しようとしないでくださいjson_encode()。これは無効な JSON になります。への 1 回の呼び出しを使用して、送信するすべてのものをエンコードしますjson_encode()

  • 多くの状況でエラーを引き起こす可能性のある不要な文字 (特に空白文字と UTF-8 BOM 文字) を送信する PHP に注意してください。

  • エラーが続く場合は、JSON URL をブラウザーに直接ロードし、ソースを表示します。エラーがすぐに表示される場合があります。そうでない場合は、JSON 文字列をコピーして Web 上の JSON テスト サイトの 1 つに貼り付け、レポートされる内容を確認します。これは、問題の説明に役立つ場合があります。

  • PHP 5.4 を使用している場合は、 のPRETTY_PRINTオプションを使用できますjson_encode()。これは、デバッグに役立つ場合があります。

于 2013-09-27T14:52:30.313 に答える
2

form_safe_jsonコマンドで何を達成しようとしているのかわかりません。

以下から返されるテキスト文字列:

$json = json_encode($result);

には正しくフォーマットされた json が含まれ、Javascript で正しく解析する必要がある場合に備えて、さらにエスケープしないでください。によって行われたエスケープはform_safe_json、json を壊します。

于 2013-09-27T14:53:58.113 に答える