कुछ दुर्लभ एन्कोडिंग के लिए, जैसे GBk - हाँ।
लेकिन आपको इसे वापस करना चाहिए, इस कारण से नहीं। जादू उद्धरण वैसे भी बंद कर दिए जाने चाहिए (और अगले PHP संस्करण में होंगे)। तो, mysql_real_escape_string() एकमात्र एस्केप फंक्शन बचा है। ध्यान दें कि यह एसक्यूएल इंजेक्शन रोकथाम कार्य नहीं है। बहुत से लोग इस बिंदु को नहीं समझते हैं:यह सिर्फ वाक्य रचना का एक हिस्सा है। इसका उपयोग किसी भी चीज़ को "सुरक्षित" करने के लिए नहीं किया जाना चाहिए, बल्कि वाक्य-रचना के अनुसार सही SQL क्वेरी को इकट्ठा करने के लिए किया जाना चाहिए। और हर बार जब आप अपनी क्वेरी बनाते हैं तो इसका उपयोग किया जाना चाहिए, इससे कोई फर्क नहीं पड़ता कि डेटा कहां से आता है। निश्चित रूप से यह आपको साइड इफेक्ट के रूप में SQL इंजेक्शन से भी बचाएगा।
बेशक, mysql_real_escape_string()
केवल उद्धृत तारों के भीतर काम करता है। तो, अगर आप करते हैं
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!
यह कुछ भी नहीं की रक्षा करेगा। यदि आप बिना उद्धरण के संख्याओं का उपयोग करने जा रहे हैं, तो इसे उचित प्रकार के लिए अनिवार्य रूप से डाला जाना चाहिए, जैसे:
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
- ध्यान रखें कि मो मेक
mysql_real_escape_string()
इरादा के अनुसार काम करता है, उचित क्लाइंट एन्कोडिंग सेट की जानी चाहिए, और यह संभव है केवलmysql_set_charset()
. के साथ फ़ंक्शन, SET NAMES क्वेरी वह सेट नहीं करेगी।
यदि आप इन सभी जटिलताओं से छुटकारा पाना चाहते हैं, तो आप तैयार बयान , हालांकि आपको अपने mysql ड्राइवर को mysqli या PDO में बदलना होगा।
कृपया ध्यान दें कि कोई भी उचित सिंटैक्स और न ही तैयार किए गए कथन शाब्दिक के अलावा अन्य क्वेरी भागों में आपकी मदद नहीं करेंगे। आप पहचानकर्ता या ऑपरेटरों से बच नहीं सकते हैं। यदि आप इन भागों का गतिशील रूप से उपयोग करते हैं, तो उन्हें आपकी स्क्रिप्ट में इस तरह से हार्डकोड किया जाना चाहिए, (ऑर्डर बाय क्लॉज के लिए):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";
या यह (WHERE क्लॉज)
$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";