2012-12-14 14 views
17

मैं अपने PHP में json_decode का उपयोग पोस्ट (पोस्ट ही ajax के माध्यम से क्रियान्वित किया जाता है) से डेटा पार्स करने के लिए पर विफल रहता है। मेरे कोड इस तरह दिखता है:json_decode GoDaddy होस्टिंग

$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 

इस कोड को ठीक काम करता है। जब मेरी स्थानीय लिनक्स मशीन या मेरे मैक पर निष्पादित किया जाता है, तो पारित डेटा सही ढंग से डीकोड किया जाता है और सब कुछ ठीक काम करता है। हालांकि जब गोडाडी पर एक ही कोड निष्पादित किया जाता है तो होस्टिंग साझा किया जाता है, डीकोडिंग सिंटेक्स त्रुटि के साथ विफल हो जाती है। समस्या को कम करने की कोशिश करने में काफी समय बिताते हुए, मुझे पता चला कि समस्या तब होती है जब मेरे पास JSON ऑब्जेक्ट गुणों के मानों में < या > वर्ण हैं।

अपलोडिंग हिस्सा (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); 
    } 
}) 

आप देख सकते हैं, पोस्ट पैरामीटर का मान 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 
     } 
    ] 
} 

सरणी (कार्य असाइन भूमिका के साथ) में अंतिम तत्व निकाल दिया जाता है, तो सब कुछ सफलतापूर्वक संसाधित किया जाता है: यदि यह मायने रखती है, यहाँ प्रस्तुत पोस्ट मानकों का एक उदाहरण मूल्य है। यदि मैं < और >> रिक्त स्थान वाले वर्णों को प्रतिस्थापित करता हूं, तो सबकुछ ठीक है। इस तरह के एक JSON स्ट्रिंग पर

  1. तो सिंटैक्स त्रुटि सही व्यवहार है, तो मैं क्यों नहीं अन्य दो के वातावरण में त्रुटि देख पा रहे हैं:

    दो सवाल इस से उत्पन्न होती हैं? इसके अलावा, JSON.stringify क्यों गलत स्ट्रिंग का उत्पादन कर रहा है?

  2. इस तरह के एक JSON स्ट्रिंग पर सिंटेक्स त्रुटि एक गलत व्यवहार है, तो कुछ GoDaddy के पीएचपी कार्यान्वयन या विन्यास के साथ गलत किया जाना चाहिए।

ध्यान दें कि, जबकि मैंने स्पष्ट रूप से गोडाडी के बारे में पूछा, यह केवल एकमात्र प्रदाता है जहां कोड एक त्रुटि उत्पन्न करता है। कोई भी इस स्थिति पर कुछ प्रकाश डाल सकता है?

+0

मैं जे एस के साथ सांकेतिक शब्दों में बदलना और अपने स्थानीय पीएचपी स्थापना के साथ डिकोड करने की कोशिश की है और यह ठीक (डुह) चला गया। मुझे लगता है कि आपको गोडाडी के साथ टिकट आग लगाना होगा। – ualinker

+0

@ualinker हैलो, यहां भविष्य से कोई है। क्या उन्होंने आपके टिकट का जवाब दिया? – Braiam

+0

भावी आगंतुकों के लिए लिंक करना: [क्यों json_decode मेरे लिए काम नहीं करता है?] (Https://stackoverflow.com/questions/8904764/why-json-decode-doesnt-work-for-me) –

उत्तर

14

किसी भी कारण से, केवल भगवान के होस्टिंग पर होस्टिंग (शायद कुछ अन्य स्थानों में भी, लेकिन अन्य जगहों पर मैंने परीक्षण नहीं किया), जब मैं फॉर्म सबमिट कर रहा था, तो सर्वर उद्धरण से बच रहा था - और यही वजह है कि इस मुद्दे का कारण बन रहा था। समस्या का समाधान काफी आसान था: बजाय

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

करने का मैं

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

किया था और सब कुछ पूरी तरह से काम किया।

+7

हालांकि यह वास्तव में अभी पुष्टि नहीं की जा सकती है, आपकी समस्या शायद अप्रचलित [जादू उद्धरण] (https://secure.php.net/manual/en/security.magicquotes.php) सुविधा के कारण हो सकती है। जब वापस साझा किया गया था, तो संभवतः साझा मेजबानों के लिए यह बहुत असामान्य नहीं था। –

संबंधित मुद्दे