16

PHPでPOSTからのデータを解析するために使用json_decodeします(POST自体はajaxを介して実行されます)。私のコードは次のようになります。

$data = json_decode($_POST['logdata'], true);
if(!$data) {
    $ecodes = array(
    JSON_ERROR_NONE           => "No error has occurred",
    JSON_ERROR_DEPTH          => "The maximum stack depth has been exceeded",
    JSON_ERROR_STATE_MISMATCH => "Invalid or malformed JSON",
    JSON_ERROR_CTRL_CHAR      => "Control character error, possibly incorrectly encoded",
    JSON_ERROR_SYNTAX         => "Syntax error",
    JSON_ERROR_UTF8           => "Malformed UTF-8 characters, possibly incorrectly encoded"
    );
    $err = json_last_error();
    $result = array("error" => 1, "error_msg" => "Invalid log data: " . $ecodes[json_last_error()]);
    echo json_encode($result);
    exit;
}

...  //use $data array

このコードは正常に機能します。ローカルのLinuxマシンまたはMacで実行すると、渡されたデータは正しくデコードされ、すべてが正常に機能します。ただし、godaddy共有ホスティングで同じコードを実行すると、デコードが失敗し、構文エラーが発生します。問題を絞り込むために多くの時間を費やした結果、JSONオブジェクトのプロパティの値に<または文字が含まれている場合に問題が発生することがわかりました。>

javascriptのアップロード部分(ajax)は次のようになります。

$.ajax({
    url:        '/emaillog.php',
    type:       'POST',
    dataType:   'json',
    data:       { logdata: JSON.stringify(this.logData[this.scenarioLogId]) },
    cache:      false,
    error:      function(jqXHR, textStatus, errorThrown) {
        alert("Error occurred during upload: " + textStatus);
    },
    success:    function(data, textStatus, jqXHR) {
        var msg = data.error
                  ? "An error occurred processing action log: " + data.error_msg
                  : "Action log processed successfully.";
        alert(msg);
    }
})

ご覧のとおり、POSTパラメーターの値はを使用して作成されJSON.stringify、検査時に正しくなります(クライアント側とサーバー側の両方)。重要な場合は、送信されたPOSTパラメーターの値の例を次に示します。

{
    "scenarioId":"1",
    "scenarioName":"MOH",
    "startTime":1355496349,
    "log":[
        {
         "role":"Leader",
         "task":"MOH",
         "response":"start",
         "time":1355496349
        },
        {
         "role":"Head",
         "task":"<span class=\"bold\">Assign Role</span>",
         "response":"done",
         "time":1355496351
        }
    ]
}

配列の最後の要素(タスクAssign Roleを使用)が削除されると、すべてが正常に処理されます。>文字をスペースに置き換え<ても、すべて問題ありません。>

これから2つの質問が生じます:

  1. そのようなJSON文字列の構文エラーが正しい動作である場合、他の2つの環境でエラーが表示されないのはなぜですか?また、なぜJSON.stringify間違った文字列を生成するのですか?

  2. このようなJSON文字列の構文エラーが正しくない動作である場合は、godaddyのPHPの実装または構成に問題があるはずです。

godaddyについて明示的に質問しましたが、コードがエラーを生成する唯一のプロバイダーである場合にのみ関連することに注意してください。誰でもこの状況に光を当てることができますか?

4

1 に答える 1

14

何らかの理由で、godaddyホスティングのみ(おそらく他の場所でも、テストした他の場所ではない)で、フォームを送信したときに、サーバーが引用符をエスケープしていました-それが問題の原因でした。問題の解決策は非常に簡単でした。

$data = json_decode($_POST['logdata'], true);

やった

$data = json_decode(stripslashes($_POST['logdata']), true);

そして、すべてが完璧に機能しました。

于 2012-12-18T20:18:35.260 に答える