2013-02-10 5 views
6

भागने स्ट्रिंग के बारे में उलझन में है और यह कैसे डेटाबेसMySQL PHP एस्केप स्ट्रिंग '' - बैकस्लैश के साथ डेटाबेस में क्यों सहेजा नहीं गया है?

में संग्रहित है मेरी MySQL कॉल में, मैं एक बैकस्लैश के साथ एक स्ट्रिंग से बचने:

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\'s things' 

लेकिन जब मैं phpadmin में देखो - मूल्य बचा लिया गया था इस तरह:

|Tom's things| 

बैकस्लैश डेटाबेस में क्यों सहेजा नहीं गया है? यह समस्या तब होती है जब मैं जावास्क्रिप्ट में यह मान पढ़ता हूं और फिर इसे चारों ओर पास करने का प्रयास करता हूं - मेरा जावास्क्रिप्ट तार समाप्त हो जाएगा। यही कारण है कि मैं चरित्र से बचने के लिए बच निकला।

MySQL डेटाबेस में सहेजने से पहले '\' बैकस्लैश को क्यों हटा रहा है?

यदि इसे '\' के साथ डेटाबेस में सहेजना नहीं है - तो इसके साथ निपटने का सबसे अच्छा तरीका क्या है क्योंकि आप इसे स्ट्रिंग के रूप में जावास्क्रिप्ट पर वापस भेज रहे हैं? जावास्क्रिप्ट को एक स्ट्रिंग के रूप में पारित होने पर इसे फिर से बचने के लिए?

+3

'\' ' '' के भागने अनुक्रम है' से नहीं। '\ '' 'के लिए' \\\' 'का प्रयोग करें। –

+3

क्योंकि किसी को भी डेटाबेस में उस स्लैश की आवश्यकता नहीं है? –

+0

हाँ ... मुझे लगता है कि मैं समझता हूँ कि '\' डेटाबेस में की जरूरत नहीं है - मुझे लगता है कि मैं सिर्फ खुला पाठ से निपटने के लिए सबसे अच्छा तरीका है समझने की कोशिश कर रहा हूँ - ताकि मैं इसे फिर से उपयोग कर सकते हैं जब बचाया डेटा जावास्क्रिप्ट पर वापस भेज दिया गया है - मेरे जावास्क्रिप्ट तारों को तोड़ने के बिना। – KDawg

उत्तर

8

मुझे यह कहकर शुरू करना चाहिए कि आपको वास्तव में डेटाबेस में किसी भी विशेष रूप से बचने वाले प्रारूप में डेटा संग्रहीत नहीं करना चाहिए, अगर आपको इसे किसी अन्य प्रारूप में निकालने या बाद में कुछ कारणों से डेटा खोजने की आवश्यकता है तो आपको पछतावा होगा। जो प्रारूप आप सहेज रहे हैं वह अब अच्छा दिखता है, और जावास्क्रिप्ट के लिए बैकस्लाश जोड़ना वास्तविक जावास्क्रिप्ट पर डेटा पास करते समय कोड में बेहतर होता है।

अब यही कारण है कि यह वर्तमान में ऐसा व्यवहार करता है;

स्ट्रिंग 'Tom\'s things' में, \' एक character escape sequence यह के रूप में डेटाबेस के लिए है बचाया कभी नहीं है और वास्तव में केवल MySQL समझ में एसक्यूएल स्ट्रिंग पार्स करने में कैसे जाने के लिए प्रयोग किया जाता है,।

SQL स्टेटमेंट में वर्ण ' से बचने का कारण यह है कि आप प्रारंभ करने के लिए दिखा रहे हैं अन्यथा MySQL के पास यह जानने का कोई तरीका नहीं है कि 'Tom के बाद स्ट्रिंग एकल कोट पर समाप्त नहीं होती है।

आप MySQLi या पीडीओ अपने SQL कथन खुद के निर्माण के बजाय विवरण तैयार उपयोग करते हैं, MySQL आप कभी भी कुछ भी से बचने के लिए बिना मूल्यों को पूरी तरह से अपरिवर्तित बचाने करने देगा। यह निश्चित रूप से पसंदीदा विकल्प है, क्योंकि MySQL API जो तैयार कथन का समर्थन नहीं करता है वैसे भी बहिष्कृत है।

+0

ठीक है- धन्यवाद, मैं समझता हूं। यदि इसे '\' के साथ डेटाबेस में सहेजना नहीं है - तो इसके साथ निपटने का सबसे अच्छा तरीका क्या है क्योंकि आप इसे स्ट्रिंग के रूप में जावास्क्रिप्ट पर वापस भेज रहे हैं? जावास्क्रिप्ट को एक स्ट्रिंग के रूप में पारित होने पर इसे फिर से बचने के लिए? – KDawg

+1

हाँ, मैं कहूंगा कि आपको जिस प्रारूप की आवश्यकता है, उसे सबसे अच्छा करने के लिए सबसे अच्छा किया जाता है (यानी जब आप इसे जावास्क्रिप्ट पर भेज रहे हैं) यदि आप तय करते हैं कि JSON एक बेहतर प्रारूप है उदाहरण के लिए कुछ समय बाद, आपको बहुत सी बैकस्लैश को हटाना नहीं होगा क्योंकि वे डेटाबेस में हैं। –

+0

ग्रेट - आपकी मदद और स्पष्टीकरण के लिए धन्यवाद :) – KDawg

3

बैकस्लैश को "escape character" के रूप में माना जाता है। यदि कोई बैकस्लैश नहीं था तो आपकी स्ट्रिंग Tom पर समाप्त हो जाएगी लेकिन शेष s things सिंटैक्स त्रुटि का कारण बन जाएगी।

\ MySQL को स्ट्रिंग डेलीमीटर के रूप में बच निकले ' का इलाज नहीं करने के लिए कहता है लेकिन अगली अनदेखी ' पाया जाता है।

यह बचने का पात्र केवल क्वेरी उद्देश्यों के लिए उपयोग किया जाता है और इसे उस स्ट्रिंग के हिस्से के रूप में नहीं माना जाता है जिसे आप अपडेट करना चाहते हैं।

एल्विन की तरह टिप्पणियों में सुझाव दिया गया है, यदि आप अपने डेटाबेस में बैकस्लैश रखना चाहते हैं तो आपको इसे एक और भागने वाली बैकस्लैश जोड़कर जोड़ना होगा, यानी \\। इस तरह आपकी क्वेरी देखो बनाना होगा:

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\\\'s things' 

और डेटाबेस में डेटा दिखाई देगा:

|Tom\'s things| 

आप MySQL Manual

में स्ट्रिंग शाब्दिक और भागने विशेष वर्ण के बारे में अधिक पढ़ सकते हैं यह लायक है हालांकि, डेटाबेस में पहले से बच निकलने वाली स्ट्रिंग को संग्रहीत करना एक बुरा अभ्यास है। आपको अपने कोड में विशेष पात्रों से बचने का ख्याल रखना चाहिए।

+0

धन्यवाद। क्या यह रखने के लिए सबसे अच्छी बात है या नहीं? मैं सिर्फ अपने जावास्क्रिप्ट तारों को समाप्त नहीं करना चाहता हूं। लोग फॉर्म में मुफ्त टेक्स्ट दर्ज कर रहे हैं। मैं बस यह सुनिश्चित करना चाहता हूं कि मैं अपने जावास्क्रिप्ट तारों को तोड़ूं नहीं। धन्यवाद। – KDawg

+2

नहीं, डेटाबेस में बैकस्लैश न रखें। जब आवश्यक हो तो आपके PHP/जावास्क्रिप्ट को डेटा से बचने का ख्याल रखना चाहिए। –

+0

ठीक है - तो आप PHP/जावास्क्रिप्ट के साथ डेटाबेस से इसे पढ़ते समय इसे फिर से बच रहे हैं? हाँ? – KDawg

1

वजह से, MySQL में, बैकस्लैश एक एस्केप वर्ण (जैसे यह PHP में है)। इसे स्टोर करने के लिए आपको बैकस्लैश से बचना होगा - इसलिए, \\ एक बैकस्लैश स्टोर करेगा। \\\' एक बैकस्लैश को एक उद्धरण के बाद स्टोर करेगा, क्योंकि पहली बैकस्लैश दूसरे से बच निकलती है, और तीसरा उद्धरण से बच निकलता है।

1

यह समस्याओं का कारण बनता है जब मैं जावास्क्रिप्ट

में इस मूल्य को पढ़ने के निश्चित रूप से इस नहीं करता है।
फिर आप अपने पैसे को सुरक्षित में बंद कर देते हैं, यदि आप लूट गए तो आप एक सुरक्षित निर्माता को दोषी ठहरा सकते हैं।
लेकिन जैसे ही आप अपना पैसा वापस लेते हैं और यह चोरी हो जाता है - आप अभी भी इसके लिए एक सुरक्षित दोष नहीं दे सकते।
यह तुम्हारा जिम्मेदारी अब है।

तो, अगर आप की जरूरत अपने डेटा जावास्क्रिप्ट के लिए भाग निकले - बस भाग जाते हैं।
लेकिन निश्चित रूप से mysql का उपयोग कर _escape_string()

+0

आह ... मैं देखता हूं - हर अच्छा। धन्यवाद :) – KDawg

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