2012-11-24 5 views
5

क्रमबद्ध स्ट्रिंग को एसक्यूएल में सहेजने की कोशिश कर रहा है, लेकिन फिर मुझे उद्धरणों के कारण इसे अनसुलझा करने में समस्याएं आ रही हैं।उद्धरण के साथ MySQL serialized जानकारी में सहेजें

उदाहरण के लिए, स्ट्रिंग "te'st" है, serialize के बाद हम

s:5:"te'st"; 

है लेकिन एसक्यूएल हम स्लैश जोड़ने की जरूरत में सहेजने के लिए, और मैं

serialize(addslashes($string)) 
इस के बाद

कर रहा हूँ , हमारे MySQL डीबी में हमारे पास

s:6:"te'st"; 

और यह समस्या है। एस: 6 का मतलब है कि हमारे पास 6 प्रतीक स्ट्रिंग हैं, लेकिन हमारा "te'st" केवल 5 है, इसलिए जब हम इसे अनसुलझा करने का प्रयास करते हैं, तो हमें त्रुटि मिलती है।

इसे कैसे हल करें? की कोशिश की htmlspecialchars और mysql_real_escape_string

अद्यतन:

कैसे मैं का उपयोग

mysql_query("INSERT INTO `table`(`string`) VALUES ('" . serialize(array('iId' =>$aSqlResult['typeID'], 'sName' => mysql_real_escape_string($sScanResultLine))) . "')"); 

उत्तर

6

आप क्रमबद्धता के बाद भागने समारोह के माध्यम से डेटा पास चाहिए, न से पहले - है जो आप अब कर रहे हैं।

$serialized = mysql_real_escape_string(serialize($data)); 

पीडीओ या MySQLi के साथ एक पैरामीटरयुक्त क्वेरी का उपयोग करें और आप पूरी तरह से भागने के बारे में भूल सकते हैं।

+0

एक आकर्षण की तरह काम करता है! – MyMomSaysIamSpecial

3

mysql_real_escape_string अपने मामले mysql_real_escape_string() में जाने का रास्ता है। इसे तब तक काम करना है जब तक कि आपने इसे किसी भी तरह गलत नहीं किया (नोट: उस फ़ंक्शन को कॉल करने से पहले आपको डीबी से कनेक्ट होने की आवश्यकता है)। और वास्तव में आपको mysqli_ या PDO का उपयोग करना चाहिए, mysql_ एक्सटेंशन जो अब बहिष्कृत नहीं है। htmlspecialchars() का उपयोग कर कार्य के लिए बस गलत उपकरण का उपयोग कर रहा है।

कोड इस तरह होना चाहिए:

mysql_real_escape_string(serialize($string)); 
+0

यू सही था, मैं escape_string() गलत का उपयोग कर रहा हूं। – MyMomSaysIamSpecial

6

आप एक गलती कर रहे हैं मैंने कई बनाने को देखा है। कार्यों से बचने और उपयोग किए जाने के बारे में एक मौलिक गलतफहमी का थोड़ा सा।

आप बस भागने के कार्यों को चेन नहीं कर सकते हैं और किसी भी संदर्भ के लिए सही कुछ भी खत्म कर सकते हैं। अपनी गलती .. सरल है

आप दो बातें कर रहे हैं:

  1. एक वस्तु (इस मामले में एक स्ट्रिंग)
  2. बचत Serializing कि डेटाबेस में।

तो इससे पहले कि आप इसे डेटाबेस में सहेज लें, आपको यह सुनिश्चित करना होगा कि आपका मान ठीक से बच निकला है। MYSQLI के साथ यह करो! Mysql_ फ़ंक्शन मर चुके हैं।

बराबर mysqli::real_escape_string है।

लेकिन सबसे महत्वपूर्ण .. (पर इस खींच लिए खेद) ..

serialize को संशोधित करता है उत्पादन, यह चीजों की एक पूरी गुच्छा लौट सकते हैं .. उद्धरण, 0x00 की और इस mysql प्रश्नों में अनुमति नहीं है ।

तो real_escape_string स्पष्ट रूप से अंतिम चरण होना चाहिए! पहले serialize, और उस समारोह के उत्पादन से बचें। आपने बिल्कुल विपरीत किया था।

+1

इस जानकारी के लिए आपको बहुत बहुत धन्यवाद! – MyMomSaysIamSpecial

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