PHP: MySQL एक्सटेंशन को हटा दिया गया है

  • PHP 5.5 के बाद से पदावनत ... PHP 7.0 में चला गया
  • एक खराब डिजाइन
    • अस्तित्व के 15 से अधिक वर्षों
    • DB कनेक्शन: अंतिम एक डिफ़ॉल्ट एक है
    • गलती संभालना? क्या त्रुटि से निपटने?
    • MySQL 3.23 के लिए डिज़ाइन किया गया
    • एन्क्रिप्ट किए गए कनेक्शन
    • कोई तैयार बयान नहीं
  • भविष्य के लिए खतरा
    • जल्द ही कोई और रखरखाव नहीं किया जाएगा
  • तो, क्या उपयोग करें?
  • प्रचार कीजिये

PHP एक अद्भुत वेब सर्वर प्रोग्रामिंग भाषा है, लेकिन यह केवल संरचित डेटा को संग्रहीत करने के लिए महान नहीं है। इसलिए इसमें एक्सटेंशन हैं, जो लोकप्रिय MySQL सहित DBMSs (डेटाबेस मैनेजमेंट सिस्टम) से कनेक्ट और उपयोग कर सकते हैं। यह एक सम्मानजनक डीबी इंजन है, विशेष रूप से सक्रिय विकास और लोकप्रिय उपयोग के साथ, [डब्ल्यू / एल / एम] एएमपी सेटअप में।

हालाँकि, PHP में इसका उपयोग PHP MySQL एक्सटेंशन के माध्यम से (ऐतिहासिक रूप से) किया जाता है (

 माई एसक्यूएल_* 
कार्य), जो अप्रचलित और पदावनत है! (मिक्स अप न करें: MySQL ही अपग्रेड नहीं किया गया है)

अपने आप को संभालो, यह लेख बहुत लंबा है ... यदि आप पढ़ना नहीं चाहते हैं, तो बस इसे याद रखें: सभी पर प्रतिबंध लगा दें

 माई एसक्यूएल_* 
फ़ंक्शन और mysql i या PDO का उपयोग करें।

PHP 5.5 के बाद से पदावनत ... PHP 7.0 में चला गया

PHP 5.5.0 आधिकारिक तौर पर 20 जून, 2013 को जारी किया गया था (2013 के PHP समाचार संग्रह, जारी नोटों सहित देखें)। इस संस्करण में, PHP डेवलपर्स ने MySQL एक्सटेंशन को अपग्रेड करने का निर्णय लिया।

निर्णय के RFC पृष्ठ पर इसके कई कारण व्यक्त किए गए हैं। यह अक्सर पूछे जाने वाले प्रश्न लेख उन्हें परेशान करता है।

इसके अलावा, PHP 7.0 के बाद से, एक्सटेंशन को पूरी तरह से हटा दिया गया है, क्योंकि यह असंबद्ध था और भाषा के रनटाइम के नए संस्करण के साथ असंगत हो गया।

इसलिए, जो कहता है कि पदावनत किया गया है, कहते हैं कि इसे और अधिक उपयोग न करने के अच्छे कारण हैं बस इतना है कि आप किसी भी मत भूलना

 माई एसक्यूएल_* 
समारोह का उपयोग एक ट्रिगर होगा
 E_DEPRECATED 
PHP 5.5+ में डिफ़ॉल्ट रूप से चेतावनी (त्रुटि नहीं)।

एक खराब डिजाइन

अस्तित्व के 15 से अधिक वर्षों

MySQL एक्सटेंशन को PHP 2.0 में पेश किया गया था, वह भी 1998 से पहले, वर्ष PHP 3 जारी किया गया था। 15 साल पुरानी प्रोग्रामिंग तकनीक हमेशा की तरह आज भी कुशल नहीं है, यहां तक ​​कि आईटी में भी, जो बहुत तेजी से विकसित होती है। अन्य DBMS एक्सटेंशन की तुलना में इसकी (सापेक्ष) सुस्ती को समझा जा सकता है ... और नीचे वर्णित आज के उपयोग के लिए महत्वपूर्ण कुछ विशेषताओं की कमी भी बताती है।

DB कनेक्शन: अंतिम एक डिफ़ॉल्ट एक है

 माई एसक्यूएल_* 
फ़ंक्शन, यदि स्पष्ट रूप से नहीं बताया गया है, तो उपयोग करने के लिए डीबी कनेक्शन पर विचार करें जो हाल ही में खोला गया है। यह व्यवहार दो मामलों में समस्याग्रस्त है:
  • जब आप एक ही समय में कई DB का उपयोग करते हैं: कनेक्शन पैरामीटर पास करना भूल जाते हैं, और आपका SQL अनुरोध गलत DB में चला जाता है।
  • बग को ट्रैक करने के लिए: कोई भी चर स्पष्ट रूप से कनेक्शन का वर्णन नहीं करता है, इसलिए PHP IDE / डिबगर का उपयोग करना असंभव है: आपको आवश्यक रूप से पता लगाना चाहिए
     mysql_connect 
    यदि आवश्यक हो तो स्वयं और डिबगिंग कोड जोड़ें।

गलती संभालना? क्या त्रुटि से निपटने?

PHP 5 ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से सीधे लाया गया एक प्रतिमान लाता है: अपवाद। MySQL एक्सटेंशन बहुत पुराना है और इन्हें इस्तेमाल करने के लिए कभी अपडेट नहीं किया गया है, इसलिए त्रुटियों को पकड़ने का एकमात्र तरीका mysql_error () का उपयोग करना है। इस तकनीक के लिए बड़ा नकारात्मक: आपको अपनी त्रुटि हैंडलिंग कोड को प्रत्येक के बाद रखना होगा
 माई एसक्यूएल_* 
फ़ंक्शन कॉल!

अपवाद एक कोड ब्लॉक को बाधित करने और त्रुटि से निपटने के लिए सीधे जाने की अनुमति देता है, न केवल प्रोग्रामर के लिए कोड को सरल करता है, बल्कि PHP के लिए भी: अपवाद केवल निष्क्रिय और ट्रिगर होते हैं जब कोई फ़ंक्शन स्वयं द्वारा एक त्रुटि की रिपोर्ट करता है। दूसरे दृष्टिकोण के साथ, PHP को हर बार जांच करनी चाहिए कि क्या सब कुछ योजना के अनुसार चला गया है, और अधिकांश समय ऐसा किया गया ... यह बेकार काम है।

MySQL 3.23 के लिए डिज़ाइन किया गया

अधिक उन्नत (My) SQL उपयोगकर्ता निराश हो जाएंगे: 3.23 के बाद विकसित कुछ सुविधाएँ बस उपलब्ध नहीं हैं, क्योंकि उपयुक्त एक्सटेंशन अपडेट की कमी के कारण।

इसका परिणाम SQL प्रक्रियाओं की कमी है, जो कुछ मामलों में बहुत उपयोगी हैं।

कुछ लोगों के अनुसार, एक्सटेंशन में कुछ टेक्स्ट एनकोडिंग के मुद्दे भी हैं।

एन्क्रिप्ट किए गए कनेक्शन

दूरस्थ DB कनेक्शन एसएसएल (सिक्योर सॉकेट लेयर) का उपयोग करके सुरक्षित किया जा सकता है, लेकिन टीएलएस (ट्रांसपोर्ट लेयर सिक्योरिटी) नहीं। जैसा कि हाल ही की कुछ घटनाओं ने साबित किया है (लेखन के रूप में, ओपनएसएसएल का हार्टब्लेड) एसएसएल एक टूटा हुआ प्रोटोकॉल है, और इसे बहुत सारे कारणों से टीएलएस 1.1+ द्वारा प्रतिस्थापित किया जाना चाहिए जिन्हें यहां समझाया नहीं जाएगा। एक्सटेंशन टीएलएस का समर्थन नहीं करता है, इसलिए हर किसी को एन्क्रिप्शन मानक का उपयोग करने के लिए मजबूर करता है जिसे भी पदावनत माना जाना चाहिए।

कोई तैयार बयान नहीं

क्या आपने बोल्ड और अंडरलाइन शीर्षक को नोटिस किया? यह शायद इस पूरे लेख का सबसे महत्वपूर्ण बिंदु है:

MySQL एक्सटेंशन में कोई तैयार स्टेटमेंट नहीं है

वहाज़ात, और वे इतने महत्वपूर्ण क्यों हैं? SQL अनुरोध उपयोगकर्ता की पसंद के अनुसार अधिकांश समय परिवर्तनशील होते हैं; सबसे सरल (और दुखद रूप से सबसे व्यापक) समाधान इस तरह दिखता है:

 mysql_query ('अपडेट सदस्य SET नाम = "'। $ _ GET ['नाम']]" "WHERE नाम =" '। $ नाम। ""'); 

सब कुछ ठीक है, आप उपयोगकर्ता के डेटा के आसपास दोहरे उद्धरण चिह्नों को लगाते हैं। बहुत बुरा, यह पर्याप्त से दूर है: कोई भी उपयोगकर्ता एक्सेस करके एक व्यवस्थापक बन सकता है

 बदल-name.php? नाम =% 22% 20admin% 3D1% 20name% 3 डी% 22USERNAME 
। कुछ यादृच्छिक ट्यूटोरियल आपको उपयोग करने के लिए कहेंगे
 mysql_real_escape_string 
, जो भले ही यह कुशल हो, (ईमानदारी से) लंबे समय तक और बदसूरत है, और किसी दिए गए चर पर भ्रम और दोहरा उपयोग या कोई उपयोग नहीं करता है।

तैयार किए गए बयान इस गंदगी का एक सुरुचिपूर्ण समाधान प्रदान करते हैं: आप अपने अनुरोध की संरचना तैयार करते हैं, फिर इसे अपने इच्छित मापदंडों के साथ निष्पादित करें (पीडीएफ़ उदाहरण:

 $ req = $ pdo-> तैयार ('UPDATE सदस्य SET नाम =: newname WHERE नाम =: name'); $ req-> निष्पादित (सरणी ("newname" => $ _GET ['नाम'], "नाम" => $ नाम)); 
यहाँ आप कभी भी SQL इंजेक्शन के बारे में चिंता किए बिना जाते हैं। आपके लिए सभी गंदे काम किए जाते हैं।

भविष्य के लिए खतरा

विस्तार खतरनाक रूप से जीवन के अंत के पास होता है, PHP से इसका विलोप आसन्न है, और आपकी साइट भी अगर यह इसका उपयोग करती है ... आज भी, विस्तार के चारों ओर एक पूरी "संस्कृति" है, जो जल्द ही गायब हो जाएगी, यह जानने के बिना: ए बहुत सारे ट्यूटोरियल और लोग अभी भी इसके उपयोग की सलाह देते हैं, इसके भविष्य को हटाने के बारे में नहीं जानते हैं। आपको मिल गया, इस संस्कृति को मिटा देना चाहिए।

इसलिए आपको अपनी स्क्रिप्ट, वेबसाइट या यहां तक ​​कि CMS (यदि संभव हो तो) को किसी अन्य DB एक्सेस एपीआई में बदलना होगा। जितनी जल्दी यह किया जाता है, बेहतर है: आपकी परियोजना शायद (अभी तक) बड़ी नहीं है, और विस्तार के दस्तावेज अभी भी आसानी से उपलब्ध हैं, जैसा कि परिवर्तित करने पर ट्यूटोरियल हैं।

उपर्युक्त डिज़ाइन समस्याएँ विस्तार को असहज बनाती हैं। लेकिन एक बार ऐसा करने के बाद, यदि आपको अपने कोड को किसी अन्य DB कनेक्शन ड्राइवर में अनुवाद करना होगा, तो यह आसान हो जाएगा: आधुनिक APIs सभी (अधिक या कम) समान हैं।

जल्द ही कोई और रखरखाव नहीं किया जाएगा

रखरखाव का अभाव एक बड़ा जोखिम लाता है: सुरक्षा उल्लंघनों जो इसके कोड में पाए जाएंगे, शायद कभी तय नहीं होंगे। यदि एक महत्वपूर्ण सुरक्षा समस्या की खोज की गई थी, जो स्विच न करने पर लाखों वेबसाइटों को धमकी देगी। कोशिश करें कि उनमें से एक न हो।

तो, क्या उपयोग करें?

इसका उत्तर आसान है, लेकिन अपना चयन करें:
  • पीडीओ
    • ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस
    • कई DBMSs के साथ काम करें: MySQL, MSSQL, sqlite, ...
  • mysqli
    • क्रॉस-संगत ऑब्जेक्ट-ओरिएंटेड और कार्यात्मक मॉडल
    • MySQL एक्सटेंशन को Higly ressembles करता है

प्रचार कीजिये

यदि आप किसी को एक्सटेंशन के उपयोग की सलाह देते हैं या इसका उपयोग करना सीख रहे हैं, तो उसे ऐसा करने के लिए कहें जो वह कर सकता है:

उसे और उसके इस लेख को बताएं और लिंक करें, जो तर्क देगा कि इसका उपयोग क्यों नहीं करना चाहिए, इसके बजाय एक लंबा और तेज उत्तर लिखने के बजाय।

यह FAQ लेख CC BY-SA के तहत लाइसेंस प्राप्त है और शुरू में gravgun द्वारा लिखा गया था।

पिछला लेख अगला लेख

शीर्ष युक्तियाँ