2009-02-13 20 views
6

unserialize कैसे मेरी सरणी को बहाल नहीं किया गया है हो?) [Function.unserialize] unserialize (: इसपीएचपी unserialize समस्या

सूचना मैंने देखा - मुझे समझ में क्यों print_r ($ प्रतिक्रिया) मुझे कुछ भी नहीं देता है नीचे कोड देखें ..

// prints a:1:{s:8:"txn_type";s:32:"recurring_payment_profile_cancel";} 
echo $item['response']; 

// prints nothing 
print_r(unserialize($item['response'])); 

** संपादित करें ऑफसेट 2797 के 6 लाइन 13

पर /home/reitinve/public_html/action/doc.php में बाइट्स में त्रुटि है कि क्या मतलब है? मेरे लिए

+1

आपके प्रश्न ने मेरा दिन बचा लिया है! – thpoul

उत्तर

3

क्या यह संभव है $item['response'] पहले या उसके बाद कुछ रिक्त स्थान हैं?

चेक strlen($item['response']) आप देता है 61

संपादित करें: यह अंत में सफेद स्थान के साथ काम करने के लिए लगता है, लेकिन शुरू में खाली स्थान के यह unserialize करने में विफल कर देगा।

संपादित करें: है कि त्रुटि संदेश या तो आप सफेद स्थान का एक बहुत (लगभग इसके बारे में 2KB), या $item['response'] है echo और unserialize

+0

नोटिस नहीं दिखाएगा यह मेरा अनुमान है। – cwallenpoole

+0

मैंने एक ट्रिम को unserialize (ट्रिम ($ आइटम ['प्रतिक्रिया']) डालने की कोशिश की)। ट्रिम को सफेद रिक्त स्थान सही से हटा देना चाहिए था? – John

+0

हां। जिस स्ट्रिंग का आप कहते हैं वह echo'd 61 बाइट्स है, लेकिन PHP कहता है कि आप 27 9 7 बाइट्स को बेअसर करने की कोशिश कर रहे हैं, इसलिए कुछ चल रहा है ... – Greg

1

काम करता है ठीक। क्या आप वाकई $item['response'] एक स्ट्रिंग है? हाँ, अग्रणी सफेद जगहों की तरह लगता है।

और अपने डेव सर्वर php कभी नहीं आप 'कुछ भी नहीं' देना चाहिए पर। इसे सभी त्रुटियों, चेतावनियों और नोटिस का उत्पादन करने के लिए कॉन्फ़िगर किया जाना चाहिए। भी आप print_r के बजाय http://php.net/var_dump का उपयोग के रूप में यह आप अधिक जानकारी दे सकते हैं।

+0

यदि unserialize का पैरामीटर स्ट्रिंग नहीं है, तो यह एक चेतावनी दिखाएगा। – cwallenpoole

+0

यह नोटिस दिखाता है कि तार भी अंतरिक्ष के साथ शुरू होता है। – SilentGhost

+0

सच है, लेकिन डिफ़ॉल्ट कॉन्फ़िगरेशन – Greg

0

यहाँ कारण है कि मैं इस समस्या थी है और मैं इसे कैसे काम के बीच बदला जा रहा है इसका मतलब है आउट:

मैं अपने इनपुट में एक सरणी इस के समान भंडारण किया गया था:

value="<?php echo htmlspecialchars(serialize(array($a, $b))); ?>" 

यहाँ, मैं वजह से संभव पार्स त्रुटि की htmlspecialchars() का इस्तेमाल किया था।

तब जब मैंने अनसुलझा करने की कोशिश की, तो उसने मुझे यह Error at offset X of Y bytes in ... त्रुटि दी। मैंने स्क्रीन पर unserialized स्ट्रिंग मुद्रित, एहसास हुआ कि कुछ पात्रों के एचटीएमएल समकक्ष त्रुटि पैदा कर रहा था।

अधिक स्पष्ट होने के लिए, डबल कोट्स एचटीएमएल कोड %22 इस त्रुटि का कारण बन रहा था। इसलिए मैंने उन्हें उद्धरण वर्णों के साथ वापस बदल दिया और यह काम किया।

unserialize(str_replace('%22', '"', $_POST['serialized'])); 

तो यह जांचना बेहतर है कि धारावाहिक स्ट्रिंग में कोई HTML कोड है या उन्हें मूल वर्णों के साथ वापस बदलें।

0

इसके अलावा, अगर आप कभी एक पाठ क्षेत्र में एक धारावाहिक सरणी डाल करने के लिए, अंत में अजाक्स के माध्यम से कहीं और इसे पारित करने के लिए, आप एम्पसेंड जैसे विशेष वर्ण (&) है कि करने के लिए convertsed हो जाएगा के साथ समस्याओं encouter सकता है की कोशिश सावधान रहना होगा "& amp ; ", और यह आपके" धारावाहिक "सरणी को पुनर्स्थापित करने के लिए पर्याप्त नहीं है।

मुझे कच्चेरलेनकोड और rawurldecode का उपयोग मेरे serialization बुलेटप्रूफ बनाने के लिए बहुत उपयोगी पाया, इससे कोई फर्क नहीं पड़ता कि यह मेरी लिपियों में कैसे किया जाता है;

$myArray = array("Bugs Bunny", "Tom & Jerry"); 

$serialized = rawurlencode(serialize($myArray)); 

$myUnserializedArray = rawurldecode(unserialize($serialized));