सवाल PHP में mysql_ * फ़ंक्शंस का उपयोग क्यों नहीं करना चाहिए?


तकनीकी कारण क्या हैं जिनका उपयोग नहीं करना चाहिए mysql_* कार्यों? (उदाहरण के लिए mysql_query(), mysql_connect() या mysql_real_escape_string())?

अगर मैं अपनी साइट पर काम करता हूं तो भी मुझे कुछ और क्यों उपयोग करना चाहिए?

अगर वे मेरी साइट पर काम नहीं करते हैं, तो मुझे त्रुटियां क्यों मिलती हैं

चेतावनी: mysql_connect (): ऐसी कोई फ़ाइल या निर्देशिका नहीं


2196
2017-10-12 13:18


मूल


इस तरह की त्रुटि: घातक त्रुटि: असीमित त्रुटि: अपरिभाषित फ़ंक्शन mysql_connect () पर कॉल करें ... - Bimal Poudel
अकेले बहिष्कृत उनसे बचने के लिए पर्याप्त कारण है - Sasa1234


जवाब:


MySQL एक्सटेंशन:

  • सक्रिय विकास के तहत नहीं है
  • है आधिकारिक तौर पर पदावनत PHP 5.5 के रूप में (जून 2013 जारी)।
  • गई है हटा दिया पूरी तरह से PHP 7.0 के रूप में (दिसंबर 2015 जारी)
    • इसका मतलब है कि के रूप में 31 दिसंबर 2018 यह PHP के किसी भी समर्थित संस्करण में मौजूद नहीं होगा। वर्तमान में, यह केवल हो जाता है सुरक्षा अद्यतन।
  • एक ओओ इंटरफेस लाता है
  • समर्थन नहीं करता है:
    • गैर-अवरुद्ध, असीमित प्रश्न
    • तैयार बयान या पैरामीटरयुक्त प्रश्न
    • संग्रहित प्रक्रियाएं
    • एकाधिक वक्तव्य
    • लेन-देन
    • "नया" पासवर्ड प्रमाणीकरण विधि (डिफ़ॉल्ट रूप से MySQL 5.6 में; 5.7 में आवश्यक)
    • MySQL 5.1 में सभी कार्यक्षमता

चूंकि इसे बहिष्कृत किया गया है, इसका उपयोग करके आपका कोड कम भविष्य का प्रमाण बनाता है।

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

देख एसक्यूएल एक्सटेंशन की तुलना


1814
2018-01-01 11:52



अकेले बहिष्कृत उनसे बचने के लिए पर्याप्त कारण है। वे एक दिन नहीं होंगे, और यदि आप उन पर भरोसा करते हैं तो आप खुश नहीं होंगे। बाकी चीजों की एक सूची है जो पुराने एक्सटेंशन का उपयोग करके लोगों को सीखने से रोकती है। - Tim Post♦
बहिष्कार जादू बुलेट नहीं है हर कोई ऐसा लगता है कि यह है। PHP स्वयं एक दिन नहीं होगा, फिर भी हम आज हमारे निपटान में मौजूद उपकरणों पर भरोसा करते हैं। जब हमें उपकरण बदलना होगा, तो हम करेंगे। - Lightness Races in Orbit
@LightnessRacesinOrbit - बहिष्कार एक जादू बुलेट नहीं है, यह एक झंडा है जो कहता है "हम इसे पहचानते हैं इसलिए हम इसे लंबे समय तक समर्थन नहीं दे रहे हैं"। कोड के बेहतर भविष्य के प्रमाणन होने के दौरान बहिष्कृत सुविधाओं से दूर जाने का एक अच्छा कारण है, यह केवल एकमात्र (या यहां तक ​​कि मुख्य भी नहीं) है। उपकरण बदलें क्योंकि बेहतर उपकरण हैं, न कि क्योंकि आपको मजबूर होना पड़ता है। (और इससे पहले कि आप को मजबूर कर दिया जाए, इससे पहले कि आप नए लोगों को नहीं सीख रहे हैं, क्योंकि आपके कोड ने काम करना बंद कर दिया है और कल फिक्सिंग की जरूरत है ... जो नए टूल्स सीखने का सबसे बुरा समय है)। - Quentin
तैयार बयान की कमी के बारे में मैंने जो कुछ नहीं देखा है, वह प्रदर्शन मुद्दा है। हर बार जब आप एक बयान जारी करते हैं, कुछ कुछ इसे संकलित करना है ताकि MySQL डिमन इसे समझ सके। इस एपीआई के साथ, यदि आप एक लूप में एक ही क्वेरी के 200,000 जारी करते हैं, तो यह समझने के लिए 200,000 बार क्वेरी को MySQL के लिए संकलित करना होगा। तैयार बयानों के साथ, यह एक बार संकलित किया गया है, और फिर संकलित एसक्यूएल में मान पैरामीटरकृत हैं। - Goldentoa11
@ सिमबीन, यह निश्चित रूप से करता है नहीं तैयार बयान का समर्थन करें। वास्तव में यह मुख्य कारण है कि इसे बहिष्कृत क्यों किया गया है। तैयार कथन के बिना (उपयोग करने में आसान) MySQL एक्सटेंशन अक्सर एसक्यूएल इंजेक्शन हमलों का शिकार होता है। - rustyx


PHP MySQL से कनेक्ट करने के लिए तीन अलग-अलग एपीआई प्रदान करता है। ये हैं mysql(PHP 7 के रूप में हटा दिया गया) mysqli, तथा PDO एक्सटेंशन।

mysql_* कार्यों को बहुत लोकप्रिय माना जाता था, लेकिन उनका उपयोग अब प्रोत्साहित नहीं किया जाता है। प्रलेखन टीम डेटाबेस सुरक्षा स्थिति पर चर्चा कर रही है, और उपयोगकर्ताओं को सामान्य रूप से प्रयुक्त ext / mysql एक्सटेंशन से दूर जाने के लिए शिक्षित करने का हिस्सा है (चेक php.internals: ext / mysql को बहिष्कृत करना)।

और बाद में PHP डेवलपर टीम ने उत्पन्न करने का निर्णय लिया है E_DEPRECATED त्रुटियां जब उपयोगकर्ता MySQL से कनेक्ट होते हैं, चाहे से mysql_connect(), mysql_pconnect() या अंतर्निहित कनेक्शन कार्यक्षमता में बनाया गया ext/mysql

ext/mysql था आधिकारिक तौर पर PHP 5.5 के रूप में बहिष्कृत और किया गया है PHP 7 के रूप में हटा दिया गया

लाल बॉक्स देखें?

जब आप किसी पर जाते हैं mysql_* फंक्शन मैनुअल पेज, आप एक लाल बॉक्स देखते हैं, समझाते हुए इसका उपयोग नहीं किया जाना चाहिए।

क्यूं कर


से दूर जा रहा है ext/mysql न केवल सुरक्षा के बारे में है, बल्कि MySQL डेटाबेस की सभी सुविधाओं तक पहुंच के बारे में भी है।

ext/mysql के लिए बनाया गया था MySQL 3.23 और तब से केवल कुछ ही जोड़ों को प्राप्त किया गया है, जबकि ज्यादातर इस पुराने संस्करण के साथ संगतता रखते हैं जो कोड को बनाए रखने के लिए थोड़ा कठिन बनाता है। गुम विशेषताएं जो समर्थित नहीं है ext/mysql शामिल: (PHP मैनुअल से)।

उपयोग करने का कारण नहीं है mysql_* समारोह:

  • सक्रिय विकास के तहत नहीं
  • PHP 7 के रूप में हटाया गया
  • एक ओओ इंटरफेस लाता है
  • गैर-अवरुद्ध, असीमित प्रश्नों का समर्थन नहीं करता है
  • तैयार बयान का समर्थन नहीं करता है या पैरामीटरयुक्त प्रश्न
  • संग्रहित प्रक्रियाओं का समर्थन नहीं करता है
  • एकाधिक कथन का समर्थन नहीं करता है
  • समर्थन नहीं करता है लेन-देन
  • MySQL 5.1 में सभी कार्यक्षमताओं का समर्थन नहीं करता है

क्वांटिन के जवाब से उद्धृत बिंदु ऊपर

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

देखें एसक्यूएल एक्सटेंशन की तुलना


बहिष्करण चेतावनियों को दबा रहा है

जबकि कोड को परिवर्तित किया जा रहा है MySQLi/PDO, E_DEPRECATED सेटिंग द्वारा त्रुटियों को दबाया जा सकता है error_reporting में php.ini बाहर करने के लिए E_DEPRECATED:

error_reporting = E_ALL ^ E_DEPRECATED

ध्यान दें कि यह भी छिपाएगा अन्य बहिष्करण चेतावनियां, हालांकि, MySQL के अलावा अन्य चीजों के लिए हो सकता है। (PHP मैनुअल से)

लेख पीडीओ बनाम MySQLi: आप किस का उपयोग करना चाहिए? द्वारा देजन मार्जनोविक आपको चुनने में मदद करेगा।

और एक बेहतर तरीका है PDO, और अब मैं एक साधारण लिख रहा हूँ PDO ट्यूटोरियल।


एक सरल और छोटा पीडीओ ट्यूटोरियल


प्र। मेरे दिमाग में पहला सवाल था: 'पीडीओ' क्या है?

ए। "पीडीओ - PHP डेटा ऑब्जेक्ट्स - एक डाटाबेस एक्सेस लेयर है जो कई डेटाबेस तक पहुंच की एक समान विधि प्रदान करता है। "

alt text


MySQL से कनेक्ट हो रहा है

साथ में mysql_* फ़ंक्शन या हम इसे पुराना तरीका कह सकते हैं (PHP 5.5 और ऊपर में बहिष्कृत)

$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('testdb', $link);
mysql_set_charset('UTF-8', $link);

साथ में PDO: आपको बस एक नया बनाना है PDO वस्तु। कन्स्ट्रक्टर डाटाबेस स्रोत निर्दिष्ट करने के लिए पैरामीटर स्वीकार करता है PDOकन्स्ट्रक्टर ज्यादातर चार पैरामीटर लेता है जो हैं DSN (डेटा स्रोत नाम) और वैकल्पिक रूप से username, password

यहां मुझे लगता है कि आप सभी को छोड़कर परिचित हैं DSN; यह नया है PDO। ए DSN मूल रूप से विकल्पों की एक स्ट्रिंग है जो बताते हैं PDO कौन सा ड्राइवर उपयोग करने के लिए, और कनेक्शन विवरण। आगे के संदर्भ के लिए, जांचें पीडीओ MySQL डीएसएन

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');

ध्यान दें: आप भी उपयोग कर सकते हैं charset=UTF-8, लेकिन कभी-कभी यह एक त्रुटि का कारण बनता है, इसलिए इसका उपयोग करना बेहतर होता है utf8

अगर कोई कनेक्शन त्रुटि है, तो यह एक फेंक देगा PDOException ऑब्जेक्ट जिसे संभालने के लिए पकड़ा जा सकता है Exception आगे की।

अच्छा पढ़ा: कनेक्शन और कनेक्शन प्रबंधन ¶ 

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

दूसरी तरफ तैयार अनुकरण को बंद करना है जो सक्षम है MySQLडिफ़ॉल्ट रूप से ड्राइवर, लेकिन उपयोग करने के लिए अनुकरण तैयार किया जाना चाहिए PDO सुरक्षित रूप से।

बाद में मैं समझाऊंगा कि इम्यूलेशन तैयार क्यों किया जाना चाहिए। कारण खोजने के लिए कृपया जांचें ये पद

यदि आप पुराने संस्करण का उपयोग कर रहे हैं तो यह केवल प्रयोग योग्य है MySQL जो मैं अनुशंसित नहीं है।

नीचे एक उदाहरण है कि आप इसे कैसे कर सकते हैं:

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 
              'username', 
              'password',
              array(PDO::ATTR_EMULATE_PREPARES => false,
              PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

क्या हम पीडीओ निर्माण के बाद विशेषताओं को सेट कर सकते हैं?

हाँ, हम पीडीओ निर्माण के बाद कुछ विशेषताओं को भी सेट कर सकते हैं setAttribute तरीका:

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=UTF-8', 
              'username', 
              'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

गलती संभालना


त्रुटि प्रबंधन में बहुत आसान है PDO से mysql_*

उपयोग करते समय एक आम अभ्यास mysql_* है:

//Connected to MySQL
$result = mysql_query("SELECT * FROM table", $link) or die(mysql_error($link));

OR die() त्रुटि को संभालने का एक अच्छा तरीका नहीं है क्योंकि हम इस चीज़ को संभाल नहीं सकते हैं die। यह सिर्फ स्क्रिप्ट को अचानक समाप्त कर देगा और फिर स्क्रीन पर त्रुटि को प्रतिबिंबित करेगा जिसे आप आम तौर पर अपने अंतिम उपयोगकर्ताओं को नहीं दिखाना चाहते हैं, और खूनी हैकर्स को अपनी स्कीमा की खोज करने दें। वैकल्पिक रूप से, के वापसी मूल्य mysql_* कार्यों के साथ संयोजन के रूप में अक्सर इस्तेमाल किया जा सकता है mysql_error () त्रुटियों को संभालने के लिए।

PDO एक बेहतर समाधान प्रदान करता है: अपवाद। हम जो कुछ भी करते हैं PDO एक में लपेटा जाना चाहिए try-catch ब्लॉक। हम मजबूर कर सकते हैं PDO त्रुटि मोड विशेषता सेट करके तीन त्रुटि मोड में से एक में। तीन त्रुटि हैंडलिंग मोड नीचे हैं।

  • PDO::ERRMODE_SILENT। यह केवल त्रुटि कोड सेट कर रहा है और उतना ही काम करता है जितना mysql_* जहां आपको प्रत्येक परिणाम की जांच करनी होगी और फिर देखें $db->errorInfo(); त्रुटि विवरण प्राप्त करने के लिए।
  • PDO::ERRMODE_WARNING उठाना E_WARNING। (रन-टाइम चेतावनियां (गैर-घातक त्रुटियां)। स्क्रिप्ट का निष्पादन रोक नहीं है।)
  • PDO::ERRMODE_EXCEPTION: अपवाद फेंको। यह पीडीओ द्वारा उठाए गए त्रुटि का प्रतिनिधित्व करता है। आपको फेंकना नहीं चाहिए PDOException अपने कोड से देख अपवाद PHP में अपवादों के बारे में अधिक जानकारी के लिए। यह बहुत पसंद करता है or die(mysql_error());, जब यह पकड़ा नहीं जाता है। लेकिन इसके विपरीत or die(), द PDOException यदि आप ऐसा करना चुनते हैं तो पकड़ा जा सकता है और सुन्दर तरीके से संभाला जा सकता है।

अच्छा पढ़ा:

पसंद:

$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$stmt->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

और आप इसे लपेट सकते हैं try-catch, नीचे की तरह:

try {
    //Connect as appropriate as above
    $db->query('hi'); //Invalid query!
} 
catch (PDOException $ex) {
    echo "An Error occured!"; //User friendly message/message you want to show to user
    some_logging_function($ex->getMessage());
}

आपको संभालना नहीं है try-catch अभी। आप इसे किसी भी समय उपयुक्त पकड़ सकते हैं, लेकिन मैं दृढ़ता से आपको उपयोग करने की सलाह देता हूं try-catch। इसके अलावा इसे कॉल करने वाले फ़ंक्शन के बाहर पकड़ने के लिए और अधिक समझ हो सकती है PDO सामान:

function data_fun($db) {
    $stmt = $db->query("SELECT * FROM table");
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

//Then later
try {
    data_fun($db);
}
catch(PDOException $ex) {
    //Here you can handle error and show message/perform action you want.
}

इसके अलावा, आप द्वारा संभाल सकते हैं or die() या हम ऐसा कह सकते हैं mysql_*, लेकिन यह वास्तव में विविध होगा। आप मोड़कर उत्पादन में खतरनाक त्रुटि संदेशों को छुपा सकते हैं display_errors off और बस अपना त्रुटि लॉग पढ़ना।

अब, उपरोक्त सभी चीजों को पढ़ने के बाद, आप शायद सोच रहे हैं: बिल्ली क्या है कि जब मैं बस सरल झुकाव शुरू करना चाहता हूं SELECT, INSERT, UPDATE, या DELETE बयान? चिंता मत करो, हम यहां जाते हैं:


डेटा का चयन

PDO select image

तो आप क्या कर रहे हैं mysql_* है:

<?php
$result = mysql_query('SELECT * from table') or die(mysql_error());

$num_rows = mysql_num_rows($result);

while($row = mysql_fetch_assoc($result)) {
    echo $row['field1'];
}

अभी इसमें PDO, आप ऐसा कर सकते हैं:

<?php
$stmt = $db->query('SELECT * FROM table');

while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo $row['field1'];
}

या

<?php
$stmt = $db->query('SELECT * FROM table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

//Use $results

ध्यान दें: यदि आप नीचे की तरह विधि का उपयोग कर रहे हैं (query()), यह विधि एक देता है PDOStatement वस्तु। तो यदि आप परिणाम प्राप्त करना चाहते हैं, तो इसे ऊपर की तरह उपयोग करें।

<?php
foreach($db->query('SELECT * FROM table') as $row) {
    echo $row['field1'];
}

पीडीओ डेटा में, यह के माध्यम से प्राप्त किया जाता है ->fetch(), आपके कथन संभाल की एक विधि। लाने के लिए, सबसे अच्छा तरीका पीडीओ को बताएगा कि आप डेटा कैसे प्राप्त करना चाहते हैं। नीचे दिए गए खंड में मैं इसे समझा रहा हूं।

मोड प्राप्त करें

के उपयोग पर ध्यान दें PDO::FETCH_ASSOC में fetch() तथा fetchAll() उपरोक्त कोड इससे पता PDO पंक्तियों को कुंजी के रूप में फ़ील्ड नामों के साथ एक सहयोगी सरणी के रूप में पंक्तियों को वापस करने के लिए। कई अन्य fetch मोड भी हैं जिन्हें मैं एक-एक करके समझाऊंगा।

सबसे पहले, मैं समझता हूं कि fetch मोड का चयन कैसे करें:

 $stmt->fetch(PDO::FETCH_ASSOC)

उपर्युक्त में, मैं उपयोग कर रहा हूं fetch()। आप भी उपयोग कर सकते हैं:

  • PDOStatement::fetchAll() - सभी परिणाम सेट पंक्तियों वाली एक सरणी देता है
  • PDOStatement::fetchColumn() - परिणाम सेट की अगली पंक्ति से एक कॉलम देता है
  • PDOStatement::fetchObject() - अगली पंक्ति प्राप्त करता है और इसे एक वस्तु के रूप में लौटाता है।
  • PDOStatement::setFetchMode() - इस कथन के लिए डिफ़ॉल्ट fetch मोड सेट करें

अब मैं मोड लाने के लिए आया हूँ:

  • PDO::FETCH_ASSOC: आपके परिणाम सेट में लौटाए गए कॉलम नाम से अनुक्रमित एक सरणी देता है
  • PDO::FETCH_BOTH (डिफ़ॉल्ट): आपके परिणाम सेट में लौटाए गए कॉलम नाम और 0-अनुक्रमित कॉलम नंबर दोनों द्वारा अनुक्रमित एक सरणी देता है

और भी विकल्प हैं! उन सभी के बारे में पढ़ें PDOStatement प्रलेखन प्राप्त करें।

पंक्ति गणना प्राप्त करना:

के बजाय का उपयोग करने का mysql_num_rows लौटाई गई पंक्तियों की संख्या प्राप्त करने के लिए, आप एक प्राप्त कर सकते हैं PDOStatement और करो rowCount(), पसंद:

<?php
$stmt = $db->query('SELECT * FROM table');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';

अंतिम सम्मिलित आईडी प्राप्त करना

<?php
$result = $db->exec("INSERT INTO table(firstname, lastname) VAULES('John', 'Doe')");
$insertId = $db->lastInsertId();

सम्मिलित करें और अपडेट करें या कथन हटाएं

Insert and update PDO image

हम क्या कर रहे हैं mysql_* कार्य है:

<?php
$results = mysql_query("UPDATE table SET field='value'") or die(mysql_error());
echo mysql_affected_rows($result);

और पीडीओ में, यह वही काम किया जा सकता है:

<?php
$affected_rows = $db->exec("UPDATE table SET field='value'");
echo $affected_rows;

उपर्युक्त क्वेरी में PDO::exec एक SQL कथन निष्पादित करें और प्रभावित पंक्तियों की संख्या लौटाता है।

सम्मिलित करें और हटाएं बाद में कवर किया जाएगा।

उपर्युक्त विधि केवल तब उपयोगी होती है जब आप क्वेरी में चर का उपयोग नहीं कर रहे हैं। लेकिन जब आपको किसी क्वेरी में चर का उपयोग करने की आवश्यकता होती है, तो कभी भी ऊपर और वहां की तरह प्रयास न करें तैयार कथन या पैरामीटरयुक्त कथन है।


तैयार वक्तव्य

प्र तैयार कथन क्या है और मुझे उनकी आवश्यकता क्यों है?
ए। एक तैयार कथन एक पूर्व-संकलित SQL कथन है जिसे सर्वर पर केवल डेटा भेजकर कई बार निष्पादित किया जा सकता है।

एक तैयार कथन का उपयोग करने का सामान्य वर्कफ़्लो निम्नानुसार है (विकिपीडिया से तीन 3 बिंदु उद्धृत):

  1. तैयार करना: कथन टेम्पलेट एप्लिकेशन द्वारा बनाया गया है और डेटाबेस प्रबंधन प्रणाली (डीबीएमएस) को भेजा गया है। कुछ मान निर्दिष्ट नहीं किए जाते हैं, जिन्हें पैरामीटर, प्लेसहोल्डर्स या बाइंड वैरिएबल (लेबल किया जाता है ? नीचे):

    INSERT INTO PRODUCT (name, price) VALUES (?, ?)

  2. डीबीएमएस कथन टेम्पलेट पर क्वेरी ऑप्टिमाइज़ेशन को पार करता है, संकलित करता है और निष्पादित करता है, और इसे निष्पादित किए बिना परिणाम संग्रहीत करता है।

  3. निष्पादित: बाद में, एप्लिकेशन पैरामीटर के लिए मूल्य (या बाइंड) मान प्रदान करता है, और डीबीएमएस कथन निष्पादित करता है (संभवतः परिणाम लौटाता है)। एप्लिकेशन विभिन्न मानों के साथ जितनी बार चाहें कथन निष्पादित कर सकता है। इस उदाहरण में, यह पहले पैरामीटर के लिए 'रोटी' की आपूर्ति कर सकता है और 1.00दूसरे पैरामीटर के लिए।

आप अपने एसक्यूएल में प्लेसहोल्डर्स सहित एक तैयार कथन का उपयोग कर सकते हैं। प्लेसहोल्डर्स के बिना मूल रूप से तीन हैं (इसे ऊपर के चर के साथ प्रयोग न करें), एक अनाम नामधारक के साथ, और नामित प्लेसहोल्डर वाले एक।

प्र तो अब, नामधारकों का नाम क्या है और मैं उनका उपयोग कैसे करूं?
ए। नामित प्लेसहोल्डर्स। प्रश्न चिह्नों के बजाय, कोलन से पहले वर्णनात्मक नामों का प्रयोग करें। हमें नाम स्थान धारक में मूल्य की स्थिति / आदेश की परवाह नहीं है:

 $stmt->bindParam(':bla', $bla);

bindParam(parameter,variable,data_type,length,driver_options)

आप निष्पादन सरणी का उपयोग करके भी बाध्य कर सकते हैं:

<?php
$stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
$stmt->execute(array(':name' => $name, ':id' => $id));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

के लिए एक और अच्छी सुविधा OOP दोस्तों का नाम है कि प्लेसहोल्डर्स के पास ऑब्जेक्ट्स को सीधे अपने डेटाबेस में डालने की क्षमता है, मानते हैं कि गुण नामित फ़ील्ड से मेल खाते हैं। उदाहरण के लिए:

class person {
    public $name;
    public $add;
    function __construct($a,$b) {
        $this->name = $a;
        $this->add = $b;
    }

}
$demo = new person('john','29 bla district');
$stmt = $db->prepare("INSERT INTO table (name, add) value (:name, :add)");
$stmt->execute((array)$demo);

प्र तो अब, अज्ञात प्लेसहोल्डर क्या हैं और मैं उनका उपयोग कैसे करूं?
ए। चलो एक उदाहरण है:

<?php
$stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->bindValue(2, $add, PDO::PARAM_STR);
$stmt->execute();

तथा

$stmt = $db->prepare("INSERT INTO folks (name, add) values (?, ?)");
$stmt->execute(array('john', '29 bla district'));

उपर्युक्त में, आप उन्हें देख सकते हैं ? एक नाम स्थान धारक की तरह नाम के बजाय। अब पहले उदाहरण में, हम विभिन्न प्लेसहोल्डर को चर निर्दिष्ट करते हैं ($stmt->bindValue(1, $name, PDO::PARAM_STR);)। फिर, हम उन प्लेसहोल्डर को मूल्य आवंटित करते हैं और कथन निष्पादित करते हैं। दूसरे उदाहरण में, पहला सरणी तत्व पहले पर जाता है ? और दूसरा दूसरा ?

ध्यान दें: में अज्ञात प्लेसहोल्डर हमें सरणी में तत्वों के उचित क्रम का ख्याल रखना चाहिए जिसे हम पास कर रहे हैं PDOStatement::execute() तरीका।


SELECT, INSERT, UPDATE, DELETE तैयार प्रश्न

  1. SELECT:

    $stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
    $stmt->execute(array(':name' => $name, ':id' => $id));
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
  2. INSERT:

    $stmt = $db->prepare("INSERT INTO table(field1,field2) VALUES(:field1,:field2)");
    $stmt->execute(array(':field1' => $field1, ':field2' => $field2));
    $affected_rows = $stmt->rowCount();
    
  3. DELETE:

    $stmt = $db->prepare("DELETE FROM table WHERE id=:id");
    $stmt->bindValue(':id', $id, PDO::PARAM_STR);
    $stmt->execute();
    $affected_rows = $stmt->rowCount();
    
  4. UPDATE:

    $stmt = $db->prepare("UPDATE table SET name=? WHERE id=?");
    $stmt->execute(array($name, $id));
    $affected_rows = $stmt->rowCount();
    

ध्यान दें:

तथापि PDO और / या MySQLi पूरी तरह से सुरक्षित नहीं हैं। उत्तर की जांच करें पीडीओ एसक्यूएल इंजेक्शन को रोकने के लिए पर्याप्त बयान तैयार हैं? द्वारा ircmaxell। इसके अलावा, मैं अपने उत्तर से कुछ हिस्सा उद्धृत कर रहा हूं:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->query('SET NAMES GBK');
$stmt = $pdo->prepare("SELECT * FROM test WHERE name = ? LIMIT 1");
$stmt->execute(array(chr(0xbf) . chr(0x27) . " OR 1=1 /*"));

1163
2017-10-12 13:28



ऊपर क्या अच्छा पढ़ा जाना चाहिए उल्लेखनीय रूप से उल्लेख करना चाहिए: तैयार कथन का कोई सार्थक उपयोग दूर लेना चाहिए IN (...) construct। - Eugen Rieck
@ एमीन, नहीं, यह नहीं है! :] जबकि NullPoiиteя वास्तव में इसे लिखने का एक अच्छा काम किया, यह निश्चित रूप से एक अच्छा पठन नहीं है, क्योंकि यह लंबा रास्ता है। मुझे पूरा यकीन है कि 10 में से 8 आगंतुक इसे छोड़ देंगे। और आपके पास स्पष्टीकरण भी है, यह जवाब शीर्ष वोट क्यों नहीं दिया गया है। ए tl;dr शुरुआत में हिस्सा एक अच्छा विचार होगा, मुझे लगता है। - trejder
सवाल यह था कि "मैं PHP में mysql_ * फ़ंक्शंस का उपयोग क्यों नहीं करना चाहिए"। यह जवाब, प्रभावशाली और सहायक जानकारी से भरा हुआ है, वैसे भी डब्ल्यूएपी से बाहर निकलता है और @trejder कहते हैं - 10 में से 8 लोग उस जानकारी पर ध्यान नहीं दे रहे हैं क्योंकि उनके पास काम करने की कोशिश करने में 4 घंटे नहीं हैं यह। यह बहुत अधिक मूल्यवान टूटा हुआ होगा और कई, अधिक सटीक, प्रश्नों के उत्तर के रूप में उपयोग किया जाएगा। - Alex McMillan
Persoanlly मैं mysqli और पीडीओ पसंद करते हैं। लेकिन मरने के लिए, मैंने अपवाद विकल्प की कोशिश की function throwEx() { throw new Exception("You did selected not existng db"); } mysql_select_db("nonexistdb") or throwEx(); यह अपवाद फेंकने के लिए काम करता है। - kuldeep.kamboj


सबसे पहले, हम मानक टिप्पणी से शुरू करते हैं जो हम सभी को देते हैं:

कृपया, उपयोग न करें mysql_* नए कोड में काम करता है। वे अब बनाए रखा नहीं है और आधिकारिक तौर पर बहिष्कृत हैं। देखें लाल बॉक्स? के बारे में जानना तैयार बयान इसके बजाए, और उपयोग करें पीडीओ या MySQLi - यह लेख आपको कौन सा निर्णय लेने में मदद करेगा। यदि आप पीडीओ चुनते हैं, यहाँ एक अच्छा ट्यूटोरियल है

आइए इसके माध्यम से, वाक्य द्वारा वाक्य, और समझाओ:

  • वे अब बनाए रखा नहीं है, और आधिकारिक तौर पर बहिष्कृत हैं

    इसका मतलब यह है कि PHP समुदाय धीरे-धीरे इन पुराने कार्यों के लिए समर्थन छोड़ रहा है। वे PHP के भविष्य (हालिया) संस्करण में मौजूद नहीं होने की संभावना है! इन कार्यों का निरंतर उपयोग आपके कोड को (भविष्य में) भविष्य में तोड़ सकता है।

    नया! - ext / mysql अब है आधिकारिक तौर पर PHP 5.5 के रूप में बहिष्कृत!

    नई! ext / mysql PHP 7 में हटा दिया गया है

  • इसके बजाय, आपको तैयार बयान के बारे में सीखना चाहिए

    mysql_* विस्तार का समर्थन नहीं करता है तैयार बयान, जो (अन्य चीजों के साथ) के खिलाफ एक बहुत ही प्रभावी countermeasure है एसक्यूएल इंजेक्षन। यह MySQL आश्रित अनुप्रयोगों में एक बहुत ही गंभीर भेद्यता तय करता है जो हमलावरों को आपकी स्क्रिप्ट तक पहुंचने और प्रदर्शन करने की अनुमति देता है कोई भी संभावित प्रश्न आपके डेटाबेस पर

    अधिक जानकारी के लिए देखें मैं PHP में एसक्यूएल इंजेक्शन कैसे रोक सकता हूं?

  • लाल बॉक्स देखें?

    जब आप किसी के पास जाते हैं mysql फंक्शन मैनुअल पेज, आप एक लाल बॉक्स देखते हैं, समझाते हुए इसका उपयोग नहीं किया जाना चाहिए।

  • या तो पीडीओ या MySQLi का प्रयोग करें

    बेहतर, अधिक मजबूत और अच्छी तरह से निर्मित विकल्प हैं, पीडीओ - पीएचपी डाटाबेस ऑब्जेक्ट, जो डेटाबेस इंटरैक्शन के लिए एक पूर्ण ओओपी दृष्टिकोण प्रदान करता है, और MySQLi, जो एक MySQL विशिष्ट सुधार है।


280
2017-12-24 23:30



एक और बात है: मुझे लगता है कि फ़ंक्शन अभी भी एक कारण के लिए PHP में मौजूद है - पुराने, पुराने लेकिन अभी भी चल रहे सीएमएस, ई-कॉमर्स, बुलेटिन बोर्ड सिस्टम आदि के साथ संगतता। अंत में इसे हटा दिया जाएगा और आपको फिर से लिखना होगा आवेदन ... - Kamil
@किमिल: यह सच है, लेकिन यह वास्तव में एक कारण नहीं है कि आपको इसका उपयोग क्यों नहीं करना चाहिए। इसका उपयोग करने का कारण यह नहीं है क्योंकि यह प्राचीन, असुरक्षित आदि है :) - Madara Uchiha♦
@ मारियो - PHP devs की एक प्रक्रिया है, और उन्होंने औपचारिक रूप से 5.5 / के रूप में ext / mysql को औपचारिक रूप से बहिष्कृत करने के पक्ष में वोट दिया है। यह अब एक काल्पनिक मुद्दा नहीं है। - SDC
पीडीओ या माईएसक्लुली जैसी सिद्ध तकनीक के साथ कुछ अतिरिक्त लाइनें जोड़ना अभी भी PHP की हमेशा पेशकश की आसानी प्रदान करता है। मैं डेवलपर की खातिर आशा करता हूं कि वह जानता है कि किसी भी ट्यूटोरियल में इन ईश्वर-भयानक mysql_ * कार्यों को वास्तव में पाठ से अलग करता है, और ओपी को यह बताना चाहिए कि इस तरह का कोड 10 साल पहले soooo है- और सवाल करना चाहिए ट्यूटोरियल की प्रासंगिकता भी! - FredTheWebGuy
उत्तर का क्या उल्लेख करना चाहिए: तैयार बयान किसी भी सार्थक उपयोग को दूर ले जाता है IN (...) construct। - Eugen Rieck


उपयोग में आसानी

विश्लेषणात्मक और सिंथेटिक कारणों का पहले से ही उल्लेख किया गया था। नए आने वालों के लिए दिनांकित mysql_ फ़ंक्शंस का उपयोग रोकने के लिए एक और महत्वपूर्ण प्रोत्साहन है।

समकालीन डेटाबेस एपीआई बस हैं आसान उपयोग करने के लिए।

यह ज्यादातर है बाध्य पैरामीटर जो कोड को सरल बना सकता है। और साथ उत्कृष्ट ट्यूटोरियल (जैसा कि ऊपर देखा गया है) में संक्रमण पीडीओ अत्यधिक कठिन नहीं है।

एक बार में एक बड़ा कोड बेस लिखना समय लगता है। इस मध्यवर्ती विकल्प के लिए Raison d'être:

समकक्ष pdo_ * के स्थान पर कार्य करता है माई एसक्यूएल_*

का उपयोग करते हुए <pdo_mysql.php> आप पुरानी mysql_ फ़ंक्शंस से स्विच कर सकते हैं न्यूनतम प्रयास। यह कहते हैं pdo_ फ़ंक्शन रैपर जो उनकी जगह लेते हैं mysql_ समकक्षों।

  1. केवल include_once("pdo_mysql.php"); प्रत्येक आमंत्रण स्क्रिप्ट में जिसे डेटाबेस के साथ बातचीत करना है।

  2. हटाए mysql_ फ़ंक्शन उपसर्ग हर जगह और इसके साथ प्रतिस्थापित करें pdo_

    • mysql_connect() हो जाता है