2012-12-08 19 views
21

पर मेरे पास एक फ़ंक्शन है जिसका उपयोग मैं अपनी स्क्रिप्ट के साथ उपयोग करने के लिए करता था। openDBConn() और closeDBConn() इन दोनों को mysql_connect() फ़ंक्शन कहा जाता है। प्रयुक्त के रूप में नीचेmysql से mysqli

openDBConn(); 
$car_model = getCarModel($car_id); 
$car_color = getCarColor($car_id); 
closeDBConn(); 

यह कर देखा इस तरह से भी मुझे अब निम्नलिखित

openDBConn(); 
mysqlStartTranscation(); 

upgradeCarColor($car_id); 
addNewWing($car_id); 

mysqlCommit(); 
closeDBConn(); 

दुविधा ऐसा करने के लिए, अगर मैं mysqli करने के लिए ले जाते हैं, मैं कनेक्शन लिंक पारित करने के लिए की आवश्यकता होगी अनुमति देता है।

मेरे पास है भी कि mysql_ * सवाल पदावनत किया जा रहा है पढ़ रहा है कर रहे हैं:

  1. मैं पास कितना समय है कि मेरे कार्यों का सबसे पहले काम करना बंद?
  2. क्या मौजूदा माइस्क्ली कनेक्शन तक पहुंचने का कोई वर्तमान या भविष्य तरीका है क्योंकि मेरे कार्यों में अतिरिक्त पैरामीटर जोड़ना दर्द होगा?
  3. क्या प्रक्रियात्मक तरीके से वर्तमान mysqli कनेक्शन लिंक तक पहुंचने का कोई उचित कोडिंग तरीका है। यदि प्रक्रियात्मक में नहीं है, तो ओओपी तरीके से सबसे अच्छा क्या है?
+3

कार्यों के 'mysql_' परिवार को 5.5 में बहिष्कृत किया जाएगा, और किसी भी बाद के * प्रमुख * संस्करण में पूरी तरह हटा दिया जा सकता है। 5.5 को ध्यान में रखते हुए अभी भी बीटा में नहीं है, और रिलीज * के बाद * थोड़ी देर के बाद, आपको घबराहट करने की आवश्यकता नहीं है। इसे अच्छी और धीमी गति से लें, और अपनी गति से सीखें। साथ ही, ** संबंधित ** साइडबार पर उन प्रश्नों में से प्रत्येक अंतिम प्रश्न देखें। वे कुछ मदद करेंगे। – Charles

+3

इसके अलावा, mysqli के बजाय [पीडीओ] (http://php.net/book.pdo) पर गंभीर नजर डालें। वे दोनों सक्षम हैं, लेकिन पीडीओ का तैयार कथन वाक्यविन्यास बहुत अधिक मित्रवत है। पीडीओ ओओ- * केवल * है, और mysqli की तरह कोई प्रक्रियात्मक गिरावट नहीं है। – Charles

उत्तर

14
  1. आपके पास दुनिया में हर समय है क्योंकि वे कभी भी काम नहीं करना बंद कर देंगे!
  2. हां, ऐसा करने के कई तरीके हैं।
  3. हां, लेकिन कोई भी आकार-फिट नहीं है-सभी समाधान। हर स्थिति अलग है और आपके लिए क्या उचित है हर स्थिति के लिए विशेष स्थिति उचित नहीं हो सकती है।

पहले, वर्ष ext/mysql PHP 5.5.0 के रूप में हटा दिया गया है, लेकिन यह विस्तार ही अंततः PHP PECL repository (में ले जाया जाएगा के रूप में पूरी तरह से काम करना बंद कर कभी नहीं होगा जब यह समय आता है इसे हटाने के लिए)। हालांकि, हम अभी तक नहीं हैं और आप केवल तब प्रभावित हो सकते हैं जब आपने PHP के उस संस्करण में अपग्रेड करना चुना था। एक्सटेंशन को हटाने के लिए कोई सटीक समय निर्धारित नहीं है।

दूसरा, आप डेटाबेस कनेक्शन को संग्रहीत करने के लिए एक चर का उपयोग कर सकते हैं जैसे पुराने एक्सटी/mysql एक्सटेंशन दृश्यों के पीछे आपके लिए कर रहा था। चाल यह थी कि आप यह नहीं जानते थे कि यह क्या कर रहा था (यह आपके द्वारा बनाए गए अंतिम खुले कनेक्शन का उपयोग करता है जब आप mysql_connect कहते हैं और इसका उपयोग तब भी करता है जब आप डेटाबेस तक पहुंचने के लिए mysql_query जैसे कुछ कहते हैं)।

आप प्रक्रियात्मक शैली का उपयोग कर अपने समारोह में एक स्थिर चर के साथ ऐसा कर सकते हैं ....

function openDBConn() { 
    static $link; 
    if (!isset($link)) { 
     $link = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db'); 
    } 
    return $link; // returns the link 
} 

या आप OOP का उपयोग कर एक कक्षा स्टेटिक चर के साथ ऐसा कर सकते हैं ...

Class MyDBConnect { 

    public static $link; 

    public function openDBConn() { 
     if (!isset(static::$link)) { 
      static::$link = new mysqli('localhost', 'my_user', 'my_password', 'my_db'); 
     } 
    } 

} 

मैं आपको नए एपीआई का उपयोग करने के लिए प्रोत्साहित करना चाहता हूं और मैं इसके लिए आपको सराहना करता हूं, लेकिन जब भी आप आगे बढ़ते हैं तो भी मैं आपको सावधान करना चाहता हूं। जब आप पुराने कार्यों/mysql फ़ंक्शंस से अपने कार्यों को पुराने mysqli एक्सटेंशन में पोर्ट करना शुरू करते हैं, तो सावधान रहें कि पुराने एक्सटेंशन के खराब प्रथाओं पर भी पोर्ट न करें (जैसे पुरानी एसक्यूएल स्ट्रिंग कॉन्सटेनेशन और एस्केपिंग तकनीक एक्सटी/mysql की पेशकश की)। इसके बजाय MySQLi prepared statements and parameterized queries का लाभ उठाएं।

मैं आपके MySQL डेटाबेस (अर्थात् PDO and MySQLi) के साथ इंटरफेस करने के लिए नए एपीआई का उपयोग करने के लाभों पर आपका ध्यान केंद्रित करना चाहता हूं।

+0

इसके लिए धन्यवाद, बहुत सराहना की। मैंने हमेशा सोचा कि मैं अंतिम कनेक्शन लिंक तक पहुंचने के लिए mysqli_init() का उपयोग कर सकता हूं लेकिन यह सब एक खाली थ्रेड_आईडी –

+0

के साथ एक ऑब्जेक्ट है, आपका स्वागत है, लेकिन यह नहीं है [mysqli_init] (http://php.net/mysqli .init) करता है। इसका उपयोग किसी ऑब्जेक्ट को [mysqli_real_connect] (http://php.net/mysqli.real-connect) को सौंपने के लिए किया जाता है, जो [mysqli_connect] (http://php.net/mysqli.construct) से बहुत अलग है। । विवरण के लिए कृपया प्रासंगिक मैनुअल लिंक पढ़ें। – Sherif

+0

मैंने आपके कोड की कोशिश की लेकिन जब मैं इसे उस कार्य में बुलाता हूं जो क्वेरी करता है, तो लिंक खाली होता है। क्या मुझसे कुछ छूट रहा है? –

3

सबसे पहले मैं आपके प्रश्न पर +1 देता हूं क्योंकि यह कुछ अच्छा है कि आप अपना प्रवास शुरू करें।

class MysqliConnection{ 
    private static $connection = null; 
    public static function getConnection(){ 


     if(self::$connection === null){ 
      //Here get some routine to make your configuration extern 
      self::$connection = new Mysqli(/*args*/); 
     } 
     return self::$connection; 
} 

आप किसी क्वेरी भेजना चाहते हैं, तो आप इसे की तरह उपयोग कर सकते हैं:

OOP और तर्क

बारे में OOP प्रोग्रामिंग और तर्क गुजर, यहाँ एक समाधान है कि सिंगलटन फैक्टरी पैटर्न पर आधारित है है कि:

function methodWhichSendsAQuery(){ 
     $mysqli = MysqliConnection::getConnection(); 
     $query = $mysqli->prepare(/*your query*/); 
     /*some param bindings with $query->bindParam()*/ 
     $query->execute(); 
     return $query->fetchAll(); //an array with all results 
    } 

मैं दूसरों पर इस समाधान prefere के रूप में यह पठनीय साफ है, और वैश्विक चर पर निर्भर नहीं करता। एकल उत्तरदायित्व सिद्धांत का सम्मान किया जाता है और यह ठीक है।

पुनर्रचना mysql_ mysqli को

रिफैक्टरिंग वास्तव में मुश्किल अगर आप mysql_ पुराने तरीके से संभालने के लिए इस्तेमाल किया गया हो सकता है, मैं ressource तर्क, mysql_escape_string आदि और इतने पर बिना मतलब है।

माइस्क्ल ने एक ऐसी स्क्रिप्ट प्रदान की जो mysql_ से mysqli here पर माइग्रेट करने के लिए एक शक्तिशाली है और आप अधिक जानकारी here प्राप्त कर सकते हैं।

मैं आपसे क्या कह सकता हूं कि mysqli "तैयार कथन" नामक एक कार्यक्षमता लाता है जो वास्तव में सुरक्षा के बारे में शक्तिशाली और मजबूत है। जिस तरह से mysqli तैयार कथन संभालता है वह पीडीओ के तरीके से कम उपयोगकर्ता के अनुकूल है लेकिन गुण समान हैं।

संबंधित मुद्दे