_
और %
सामान्य रूप से MySQL में वाइल्डकार्ड नहीं हैं, और उन्हें सामान्य स्ट्रिंग अक्षर में डालने के उद्देश्यों से बच नहीं जाना चाहिए। mysql_real_escape_string
इस उद्देश्य के लिए सही और पर्याप्त है। addcslashes
इस्तेमाल नहीं किया जाना चाहिए।
_
और %
केवल LIKE
. के संदर्भ में विशेष हैं -मेल मिलाना। जब आप LIKE
. में शाब्दिक उपयोग के लिए स्ट्रिंग तैयार करना चाहते हैं बयान, ताकि 100%
एक सौ प्रतिशत से मेल खाता है और सौ से शुरू होने वाली कोई भी स्ट्रिंग नहीं, आपके पास चिंता से बचने के दो स्तर हैं।
पहला है LIKE एस्केपिंग। LIKE हैंडलिंग पूरी तरह से SQL के अंदर होती है, और यदि आप एक शाब्दिक स्ट्रिंग को एक शाब्दिक LIKE एक्सप्रेशन में बदलना चाहते हैं, तो आपको यह चरण करना होगा भले ही आप पैरामीटरयुक्त क्वेरी का उपयोग कर रहे हों !
इस योजना में _
और %
विशेष हैं और बच जाना चाहिए। भागने वाले चरित्र से भी बचना चाहिए। ANSI SQL के अनुसार, इनके अलावा अन्य वर्ण नहीं होना चाहिए बच निकले:\'
गलत होगा। (हालांकि MySQL आमतौर पर आपको इससे दूर होने देगा।)
ऐसा करने के बाद, आप भागने के दूसरे स्तर पर आगे बढ़ते हैं, जो कि सादा पुराना स्ट्रिंग शाब्दिक एस्केपिंग है। यह SQL के बाहर होता है, SQL बनाता है, इसलिए LIKE एस्केपिंग स्टेप के बाद किया जाना चाहिए। MySQL के लिए, यह mysql_real_escape_string
है पहले जैसा; अन्य डेटाबेस के लिए एक अलग कार्य होगा, आप इसे करने से बचने के लिए केवल पैरामीटरयुक्त प्रश्नों का उपयोग कर सकते हैं।
समस्या जो यहाँ भ्रम की ओर ले जाती है वह यह है कि MySQL में दोनों नेस्टेड एस्केपिंग चरणों के लिए एस्केप कैरेक्टर के रूप में बैकस्लैश का उपयोग करता है! इसलिए यदि आप एक स्ट्रिंग को शाब्दिक प्रतिशत चिह्न से मिलान करना चाहते हैं तो आपको डबल-बैकस्लैश-एस्केप करना होगा और LIKE 'something\\%'
कहना होगा। . या, यदि वह PHP में है "
शाब्दिक जो बैकस्लैश एस्केपिंग का भी उपयोग करता है, "LIKE 'something\\\\%'"
. अर्घ!
यह एएनएसआई एसक्यूएल के अनुसार गलत है, जो कहता है कि:स्ट्रिंग अक्षर में बैकस्लाश का अर्थ शाब्दिक बैकस्लाश है और एक उद्धरण से बचने का तरीका ''
है; LIKE एक्सप्रेशन में डिफ़ॉल्ट रूप से कोई एस्केप कैरेक्टर नहीं होता है।
इसलिए यदि आप पोर्टेबल तरीके से LIKE-एस्केप करना चाहते हैं, तो आपको डिफ़ॉल्ट (गलत) व्यवहार को ओवरराइड करना चाहिए और LIKE ... ESCAPE ...
का उपयोग करके अपना स्वयं का एस्केप कैरेक्टर निर्दिष्ट करना चाहिए। निर्माण। विवेक के लिए, हम बैकस्लैश के अलावा कुछ और चुनेंगे!
function like($s, $e) {
return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}
$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
या मापदंडों के साथ (उदाहरण के लिए पीडीओ में):
$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
(यदि आप अधिक पोर्टेबिलिटी पार्टी समय चाहते हैं, तो आप एमएस एसक्यूएल सर्वर और साइबेस के लिए खाते की कोशिश करने का मजा भी ले सकते हैं, जहां [
वर्ण भी गलत है, एक LIKE
. में विशेष है बयान और बच जाना है। अर्घ।)