2012-01-24 21 views
7

मैं ajax के माध्यम से डेटा पोस्ट करने के लिए कोशिश कर रहा हूँ भेजता है, यह मेरी जानकारी है php end, जब मैं print_r ($ _ POST) करता हूं तो यह कहता है किajax के माध्यम से पोस्ट json डेटा एक खाली सरणी

array(0) { 
    } 

मैं चेतावनी दे रहा हूं (jsontosend) और यह मुझे पूरी तरह से सबकुछ दिखा रहा है, साथ ही डाक mothod का उपयोग कर फायरबग में, यह एकदम सही साफ तरीके से भेजे गए सभी पैराम दिखा रहा है।

किसी भी डेटा को पास करने का एकमात्र तरीका यह है कि यदि मैं जीईटी विधि का उपयोग करता हूं।

किसी भी सलाह की बहुत सराहना की जाती है!

संपादित करें: फायरबग से पोस्ट डेटा जोड़ना। यह क्या है चेतावनी समारोह से सतर्क कर दिया जा रहा है:

{"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]} 

यह है कि क्या फ़ायरबग क्या जब POST विधि का उपयोग कर के रूप में पारित किया जा रहा दिखा रहा है:

myData=%7B%0A++++%22address%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22id%22%3A+76076%2C%0A++++++++++++%22streetaddress%22%3A+%223784+Howard+Ave%22%2C%0A++++++++++++%22city%22%3A+%22Washington+DC%22%2C%0A++++++++++++%22state%22%3A+%22DC%22%2C%0A++++++++++++%22zipcode%22%3A+20895%2C%0A++++++++++++%22latitude%22%3A+39.027820587%0A++++++++%7D%0A++++%5D%0A%7D 

और इस $ _POST की var_dump के लिए प्रतिक्रिया है :

array(0) { 

}

यह एक var_du है $ _POST की mp [ 'MyData']

NULL 
+1

क्या आपके पास पोस्ट डेटा से पहले कोई "कभी-कभी" रीडायरेक्ट है php स्क्रिप्ट तक पहुंचता है? – Cheery

+0

मुझे ऐसा नहीं लगता है, मुझे यकीन नहीं है कि मैं पूरी तरह से समझता हूं कि आपका क्या मतलब है। – Mike

+0

"जब मैं print_r ..." तुम्हारा क्या मतलब है? इस पेज को अपने ब्राउज़र में खोलना? – k102

उत्तर

7

मुझे सामग्री का उपयोग करने के तरीके से संदेह है। टाइप टाइप करें। सामग्री टाइप करने का प्रयास करें। डिफ़ॉल्ट सामग्री प्रकार एप्लिकेशन/x-www-form-urlencoded (http://api.jquery.com/jQuery.ajax/) है।

इसके अलावा, अपनी डेटा संपत्ति के लिए {mydata: jsontosend} जैसे कुछ का उपयोग करें।

$.ajax({ 
      type: "POST", 
      url: "process.php", 
      //contentType: "application/json; charset=utf-8", 
      dataType: "JSON", 
      data: {mydata: jsontosend}, 
      success: function(msg){ 
       alert(msg); 
         } 
     }); 
+0

लौटा, यह सामग्री प्रकार था! यह एक बुरा सपना है! – Mike

+0

इस पर 5 घंटे बर्बाद हो गए क्योंकि सामग्री प्रकार के रूप में बेवकूफ कुछ! यह अभी भी भयानक लग रहा है, लेकिन मुझे अभी तक स्ट्रिप्सलाश जोड़ने का मौका नहीं मिला है। – Mike

+0

विडंबना यह है कि मैंने वास्तव में कोशिश की है कि मैंने आपका जवाब देखा और यह काम किया। लेकिन आपका जवाब निश्चित रूप से यह था कि यह क्या था! धन्यवाद – Mike

2

उपयोग

data:{myData: jsontosend}

यह अपने अनुरोध में एक पैरामीटर के रूप MyData भेजना चाहिए।

+0

मैंने विभिन्न संयोजनों में, माइडाटा के साथ और बिना "" कोशिश की है और यह अभी भी एक खाली सरणी देता है। – Mike

+1

अरे क्या आपने PHP इनपुट डेटा स्ट्रीम से डेटा लाने का प्रयास किया है? ' ' – dkulkarni

+4

जब आप PHP पक्ष पर JSON सामग्री-प्रकार का उपयोग करते हैं, तो php: // इनपुट स्ट्रीम का उपयोग कर अनुरोध निकाय से मैन्युअल रूप से JSON स्ट्रिंग को मैन्युअल रूप से पढ़ना आवश्यक है। – dkulkarni

0

AJAX अनुरोध से 'डेटा टाइप: "JSON" को हटाने का प्रयास करें और जांचें।

1

dkulkarni अपने पद (जनवरी 24 07:53 पर) में टिप्पणी की के रूप में, एक ही रास्ता JSON सामग्री प्रकार आवेदन के साथ भेजा पुनः प्राप्त करने/json इनपुट धारा से सीधे इसे पुनः प्राप्त करने लगती है।

मैंने विभिन्न दृष्टिकोणों के साथ बहुत सारे परीक्षण किए, लेकिन हमेशा जब मैं JSON पर सामग्री-प्रकार सेट करता हूं, तो PHP में $ _POST खाली होता है।

मेरी समस्या है कि मुझे JSON पर सामग्री-प्रकार सेट करने की आवश्यकता है, क्योंकि सर्वर (जहां मेरे पास पहुंच नहीं है) इसकी अपेक्षा करता है, अन्यथा यह असमर्थित डेटाटाइप लौटाता है। मुझे लगता है कि वे सीधे इनपुट स्ट्रीम से पुनर्प्राप्त कर रहे हैं।

मुझे अपनी PHP फ़ाइल में पुन: पेश क्यों करना है? क्योंकि मुझे समस्याओं का परीक्षण करने के लिए प्रॉक्सी बनाना है, लेकिन यह इस धागे का बिंदु नहीं है।

+0

क्या आप डेटाटाइप नहीं छोड़ सकते: "JSON" और अभी भी सामग्री-प्रकार को हटा दें? मैंने जो किया और यह पूरी तरह से काम करता है। स्टीवन वेक्सलर के जवाब को देखने से पहले हालांकि मेरे बालों को खींचने में घंटों लग गए। – Mike

2

PHP एप्लिकेशन/जेसन अनुरोध (डिफ़ॉल्ट रूप से) को समझ में नहीं आता है। इस प्रश्न को देखें: How to post JSON to PHP with curl

2

मैंने पाया कि dkulkarni द्वारा प्रदान की गई टिप्पणी यहां सबसे अच्छा समाधान था। किसी भी जटिलता के POST डेटा प्राप्त करने के लिए सीधे इनपुट स्ट्रीम से पढ़ना आवश्यक है। $.ajax({contentType: ''}) के मान का बदलना मेरे लिए काम नहीं किया ..

इस समस्या मैं JSON मैं अपने सर्वर से पोस्टिंग हो रही थी वापस प्रतिध्वनित करने के लिए एक नियंत्रक विधि की स्थापना की समस्याओं का निवारण करने के लिए। ContentType हेडर को बदलने से कोई फर्क नहीं पड़ता। लेकिन dkulkarni की टिप्पणी को पढ़ने के बाद मैं इस से अपने सर्वर कोड बदल दिया है:

return $_POST; 

यह करने के लिए:

$data = file_get_contents('php://input'); 
    return json_decode($data); 

यह पूरी तरह से काम किया।

+0

यह पूर्ण प्रतिभा है। धन्यवाद!!!! टिप्पणी के लिए dkulkami के लिए धन्यवाद, और इस जवाब से समाधान को और स्पष्ट बनाने के लिए धन्यवाद। मैं उस पर काम कर रहा था HOURS क्यों काम कर रहा था क्यों $ _POST खाली था ... – kpollock

0

सामग्री लेना टाइप करना एक अच्छा विचार नहीं है। आप जेएसओएन प्रारूप में यह डेटा भेजना चाहते हैं। मुख्य रूप से ऊपर वर्णित किया गया है, $ data = $ _POST के साथ प्राप्त करने वाले अंत (लक्ष्य php फ़ाइल) पर डेटा तक पहुंचने का प्रयास करने के बजाय $ data = file_get_contents ('php: // input'); (पेज का अनुरोध पर)

जे एस:

यहाँ php और knockout.js के साथ एक परिदृश्य के लिए पूरे राउंड ट्रिप का एक उदाहरण है

function() { 
    var payload = ko.toJSON({ YOUR KNOCKOUT OBJECT }); 
    jQuery.ajax({ 
      url: 'target.php', 
      type: "POST", 
      data: payload, 
      datatype: "json", 
      processData: false, 
      contentType: "application/json; charset=utf-8", 
      success: function (result) { 
       alert(result); 
      } 
     }); 
}; 

और फिर target.php में (पेज अनुरोध प्राप्त करना):

$data = file_get_contents('php://input'); 
$payload_jsonDecoded = json_decode($data 
संबंधित मुद्दे