परिचय: MySQL में कोट्स की उलझन क्यों होती है?
\n\nअगर आपने कभी PHP में SQL क्वेरी लिखी है, तो आपने ज़रूर कन्फ्यूज़न का सामना किया होगा: कब सिंगल कोट्स (' ') लगाएं, कब डबल कोट्स (" "), और कब ये रहस्यमयी बैकटिक्स (` `)? एक गलत कैरेक्टर — और डेटा की जगह आपको MySQL सिंटैक्स एरर मिलेगी, या उससे भी बुरा, सुरक्षा में सेंध लग जाएगी।
यह टॉपिक Stack Overflow पर सबसे लोकप्रिय सवालों में से एक है (2 मिलियन से अधिक व्यूज!)। और यह सही भी है। अनुभवी डेवलपर्स भी कभी-कभी कन्फ्यूज़ हो जाते हैं। आज हम हमेशा के लिए सब कुछ साफ कर देंगे। आप जानेंगे:
\n\n- \n
- MySQL में हर प्रकार के कोट्स का क्या काम है \n
- PHP में डेटा को सही तरीके से कैसे एस्केप करें
- डबल कोट्स लगभग हमेशा बुरे क्यों होते हैं
- SQL इंजेक्शन से खुद को कैसे बचाएं
चलिए शुरू करते हैं! 🚀
\n\nMySQL क्वेरी की संरचना: तीन प्रकार के कोट्स
\n\nMySQL में तीन अलग-अलग चिह्न हैं जो कोट्स की तरह दिखते हैं, लेकिन पूरी तरह से अलग काम करते हैं:
\n\n1. सिंगल कोट्स (' ') — स्ट्रिंग वैल्यू के लिए
\n\nकब उपयोग करें: हमेशा जब आप कोई स्ट्रिंग (टेक्स्ट, तारीख, ईमेल, पासवर्ड) पास कर रहे हों।
\n\nSELECT * FROM users WHERE name = 'राहुल';\nINSERT INTO articles (title) VALUES ('MySQL शुरुआती गाइड');\n\nMySQL सिंगल कोट्स के अंदर की हर चीज़ को स्ट्रिंग लिटरल मानता है। इसका मतलब है कि आप डेटाबेस से कह रहे हैं: "यहाँ मेरी वैल्यू है, इसे कॉलम नाम या कमांड समझने की कोशिश मत करो"
\n\n2. डबल कोट्स (" ") — लगभग वही, लेकिन एक अंतर के साथ
\n\nस्टैंडर्ड SQL में, डबल कोट्स का उपयोग आइडेंटिफ़ायर (टेबल और कॉलम के नाम) के लिए किया जाता है। लेकिन MySQL डिफ़ॉल्ट रूप से ऐसे मोड में काम करता है जहाँ डबल कोट्स सिंगल कोट्स के बराबर होते हैं। यह अक्सर कन्फ्यूज़न पैदा करता है।
\n\n-- यह काम करेगा, लेकिन ऐसा न करना बेहतर है\nSELECT * FROM users WHERE name = "प्रिया";\n\nसमस्या: अगर आप सख्त मोड ANSI_QUOTES चालू करते हैं, तो डबल कोट्स बैकटिक्स की तरह काम करने लगेंगे। आपका कोड टूट जाएगा। इसलिए:
नियम #1: स्ट्रिंग के लिए हमेशा सिंगल कोट्स का उपयोग करें। डबल कोट्स का उपयोग केवल तब करें जब आपको पूरा भरोसा हो कि आप क्या कर रहे हैं, या अन्य DBMS के साथ संगतता के लिए।
\n\n3. बैकटिक्स (` `) — टेबल और कॉलम के नाम के लिए
\n\nबैकटिक्स (उल्टे कोट्स) आइडेंटिफ़ायर हैं। इनकी ज़रूरत होती है:
\n\n- \n
- आरक्षित शब्दों को नाम के रूप में उपयोग करने के लिए (बुरी प्रैक्टिस, लेकिन होता है)
- स्पेस या विशेष वर्ण वाले नामों के साथ काम करने के लिए
- MySQL कीवर्ड के साथ टकराव से बचने के लिए
-- बुरा: 'select' एक आरक्षित शब्द है\nSELECT * FROM select;\n\n-- अच्छा: बैकटिक्स से एस्केप करें\nSELECT * FROM `select`;\n\n-- अनिवार्य: स्पेस वाला नाम\nSELECT `user name` FROM users;\n\n-- सुझाव: टेबल और कॉलम के नाम हमेशा एस्केप करें\nSELECT `id`, `name` FROM `users` WHERE `status` = 'active';\n\nमहत्वपूर्ण: बैकटिक्स का उपयोग वैल्यू के लिए नहीं किया जा सकता। इससे एरर आएगी।
\n\n-- गलती: MySQL सोचेगा कि 'राहुल' एक कॉलम का नाम है\nSELECT * FROM users WHERE name = `राहुल`;\n\nPHP + MySQL: कोट्स में कैसे न उलझें
\n\nअब सबसे दिलचस्प बात — यह सब PHP में कैसे काम करता है। PHP खुद स्ट्रिंग के लिए सिंगल और डबल कोट्स का उपयोग करता है, और यहाँ गलती करना आसान है।
\n\nकेस #1: वेरिएबल को सीधे डालना (खतरनाक!)
\n\n// बुरा: SQL इंजेक्शन के लिए असुरक्षित\n$name = "राहुल'; DROP TABLE users; --";\n$query = "SELECT * FROM users WHERE name = '$name'";\n// परिणाम: SELECT * FROM users WHERE name = 'राहुल'; DROP TABLE users; --'\n\nयह क्लासिक SQL इंजेक्शन है। ऐसा कभी न करें!
\n\n