परिचय: इतिहास से समस्या तक
\n\nअगर आपने कभी PHP में कोड लिखा है और MySQL डेटाबेस के साथ काम किया है, तो आपने mysql_connect() या mysql_query() जैसा कोड ज़रूर देखा होगा। लगभग 10-15 साल पहले यही मानक हुआ करता था। लेकिन समय बदल गया है, और आज mysql_* फंक्शन्स का उपयोग करना ऐसा ही है जैसे नए MacBook पर Windows 95 चलाने की कोशिश करना। हो सकता है, लेकिन क्यों?
Stack Overflow पर सवाल "Why shouldn't I use mysql_* functions in PHP?" को हज़ारों व्यूज़ और सैकड़ों वोट मिले हैं। यह कोई संयोग नहीं है: सुरक्षा और डेटाबेस के साथ काम करने का आधुनिक तरीका किसी भी डेवलपर के लिए बेहद महत्वपूर्ण है। इस लेख में हम जानेंगे कि mysql_* सिर्फ "पुराना" ही नहीं, बल्कि स्पष्ट रूप से खतरनाक क्यों है, और इसके बदले क्या उपयोग करें।
समस्या #1: PHP 7 से mysql_* पूरी तरह हटा दिए गए
\n\nसबसे स्पष्ट कारण: PHP 5.5.0 से mysql_* फंक्शन्स को deprecated (पुराना) घोषित किया गया, और PHP 7.0 में इन्हें पूरी तरह हटा दिया गया। अगर आपका सर्वर PHP 7+ में अपडेट होता है, तो mysql_connect(), mysql_query() और ऐसे सभी फंक्शन्स का उपयोग करने वाला कोड काम करना बंद कर देगा। आपको यह घातक त्रुटि मिलेगी:
Fatal error: Call to undefined function mysql_connect()\n\nयह "शायद काम न करे" जैसी बात नहीं है, यह साइट के क्रैश होने की गारंटी है। इसलिए पहला और मुख्य कारण: अनुकूलता (compatibility)। कोई भी होस्टिंग देर-सबेर PHP अपडेट करेगी, और आपका प्रोजेक्ट मृत क्षेत्र में आ जाएगा।
\n\nसमस्या #2: SQL इंजेक्शन से सुरक्षा का अभाव
\n\nआइए mysql_* के साथ एक सामान्य कोड देखें:
<?php\n$connection = mysql_connect('localhost', 'user', 'password');\nmysql_select_db('my_database', $connection);\n\n$username = $_POST['username'];\n$password = $_POST['password'];\n\n$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";\n$result = mysql_query($query, $connection);\n\nif (mysql_num_rows($result) > 0) {\n echo "स्वागत है!";\n} else {\n echo "गलत उपयोगकर्ता नाम या पासवर्ड";\n}\n?>\n\nयह हानिरहित लगता है? अब कल्पना करें कि एक हमलावर username फील्ड में यह स्ट्रिंग डालता है:
admin' OR '1'='1\n\nक्वेरी बन जाती है:
\n\nSELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '...'\n\nऔर बस — '1'='1' हमेशा सत्य होता है, इसलिए क्वेरी टेबल की पहली रिकॉर्ड लौटा देगी। हमलावर बिना पासवर्ड के सिस्टम में घुस जाता है। यह एक क्लासिक SQL इंजेक्शन है। mysql_* फंक्शन्स डेटा को एस्केप करने के लिए कोई अंतर्निहित सुविधा प्रदान नहीं करते — आपको मैन्युअल रूप से mysql_real_escape_string() का उपयोग करना होगा, जो वैसे भी पुराना हो चुका है।
इसकी तुलना आधुनिक तरीकों से करें, जहाँ सुरक्षा आर्किटेक्चर में ही बनी होती है (इसके बारे में नीचे बताया गया है)।
\n\nसमस्या #3: पुरानी आर्किटेक्चर और समर्थन का अभाव
\n\nmysql_* एक प्रोसीजरल इंटरफ़ेस है, जो इन सुविधाओं का समर्थन नहीं करता:
- \n
- प्रिपेयर्ड स्टेटमेंट्स (prepared statements) — इंजेक्शन से बचाव का मुख्य उपकरण। \n
- ऑब्जेक्ट-ओरिएंटेड शैली — आधुनिक PHP में ऑब्जेक्ट्स के साथ काम करना आम है। \n
- एकाधिक क्वेरीज़ — एक कॉल में कई SQL कमांड निष्पादित नहीं किए जा सकते। \n
- ट्रांज़ैक्शन — हालाँकि इन्हें एमुलेट किया जा सकता है, लेकिन अंतर्निहित समर्थन नहीं है। \n
- स्टोर्ड प्रोसीजर — इनके साथ काम करना बेहद असुविधाजनक है। \n
इसके अलावा, mysql_* एक्सटेंशन 2014 से अपडेट नहीं किया गया है। PHP डेवलपर्स ने इसका समर्थन बंद कर दिया है। इसका मतलब है कि डेटाबेस की कोई भी नई सुविधा, सुरक्षा सुधार या ऑप्टिमाइज़ेशन — ये सब आपके हाथ से निकल जाते हैं।
mysql_* के बजाय क्या उपयोग करें?
\n\nPHP में दो आधुनिक, समर्थित