2012-12-14 9 views
17

私はPHPでデータを解析するためにPHPでを使用しています(POST自体はajax経由で実行されます)。私のコードは次のようになります:json_decodeがgodaddy hostingで失敗する

$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({ 
    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を使用して作成され、検査に正しいとされ(クライアント側とサーバー側の両方) 。

{ 
    "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 
     } 
    ] 
} 

(タスク役割を割り当てて)、配列の最後の要素が削除されている場合は、すべてが正常に処理されています。それは重要な場合は、ここに提出POSTパラメータの値の例です。 <>>の文字をスペースで置き換えても、すべて問題ありません。

二つの質問は、このから発生する:

  1. なJSON文字列に構文エラーが正しい行動であれば、なぜ私は他の2つの環境ではエラーが表示されないのですか?また、なぜJSON.stringifyが不正な文字列を生成するのですか?

  2. このようなJSON文字列の構文エラーが正しくない場合、godaddyのPHP実装または設定で何かが間違っている必要があります。

私はゴダディについて明示的に尋ねていますが、コードがエラーを生成する唯一のプロバイダである限り関連性があります。誰もがこの状況について何か光を当てることができますか?

+0

私はJSでエンコードしようとしましたが、私のローカルPHPインストールでデコードして、大丈夫(duh)になりました。私はGoDaddyでチケットを発砲する必要があると思う。 – ualinker

+0

@ualinkerこんにちは、ここは将来の誰か。彼らはあなたのチケットに応答しましたか? – Braiam

+0

今後の訪問者のためのリンク:[なぜjson_decodeが機能しないのですか?](https://stackoverflow.com/questions/8904764/why-json-decode-doesnt-work-for-me) –

答えて

14

godaddyのホスティングのみで(私がテストした他の場所ではないかもしれませんが)、フォームを送信していたときに、サーバーが引用符をエスケープしていました。問題を解決するには、非常に簡単でした。代わりに

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

を行うので、私は

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

を行なったし、すべてが完璧に働きました。

+7

これは実際には確認できませんが、あなたの問題は恐らく古くなった[Magic Quotes](https://secure.php.net/manual/en/security.magicquotes.php)機能が有効になっているためです。戻るときに、共有ホストがこれを有効にすることはあまり一般的ではありませんでした。 –