2009-10-16 11 views
14

इसलिए हाल ही में मैंने वास्तव में PHP का सक्रिय रूप से उपयोग करना शुरू कर दिया है, और मुझे डेटाबेस कनेक्शन का उपयोग करने के विभिन्न तरीकों पर कुछ अंतर्दृष्टि की आवश्यकता है।आप php में डेटाबेस कनेक्शन कैसे प्रबंधित करते हैं?

सबसे पहले मैं सिर्फ सरल mysql_connect() का प्रयोग किया:

<?php 
    $connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error()); 
    mysql_select_db(DB_DB, $connection); 
?> 

थोड़ी देर मैं एक डेटाबेस वर्ग जो मैं शामिल हैं और हर फ़ाइल में प्रारंभ करने में शुरू कर दिया बनाया के बाद - कुछ इस तरह:

<?php 
class MySQL_DB { 

var $connection; 

function MySQL_DB(){ 
    $this->connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error()); 
    mysql_select_db(DB_DB, $this->connection); 
} 

function query($q){ 
    $res = mysql_query($q, $this->connection) or die(mysql_error()); 
    return $res; 
} 
} 

$database = New MySQL_DB; 
?> 

और यही वह समय है जिसका मैं उपयोग कर रहा हूं - और यह ठीक काम कर रहा है - लेकिन हमेशा सुधार करने के तरीके हैं।

तो मेरा सवाल है कि आप अपने डेटाबेस कनेक्शन कैसे प्रबंधित करते हैं?

  • क्या आप कक्षाओं का उपयोग करते हैं?
  • आपकी कक्षाओं में क्या होता है (केवल कनेक्शन या यहां तक ​​कि फ़ंक्शन?)
  • आप किस अभ्यास की अनुशंसा करते हैं?

उत्तर

3

कक्षाओं का उपयोग अनुकूलित पुन: प्रयोज्यता बढ़ाने के लिए जाने का तरीका है।

कक्षा में सभी सामान्य कार्यान्वयन में लाएं। आप सही रास्ते पर हैं।

This website has the following clean approach .

class connection { 
    // Possible Modules are as follows: 
    // DBX_MYSQL, DBX_ODBC, DBX_PGSQL, DBX_MSSQL, DBX_FBSQL, DBX_SYBASECT, DBX_OCI8, DBX_SQLITE 
    private $module = DBX_MYSQL; 

    private $host = "localhost"; 
    private $database = "test"; 
    private $username = "testuser"; 
    private $password = "testpass"; 

    private $link; 
    private $result; 
    public $sql; 

    function __construct($database=""){ 
      if (!empty($database)){ $this->database = $database; } 
      $this->link = dbx_connect($this->module,$this->host,$this->database,$this->username,$this->password); 
      return $this->link; // returns false if connection could not be made. 
    } 

    function query($sql){ 
      if (!empty($sql)){ 
        $this->sql = $sql; 
        $this->result = dbx_query($this->link,$sql,DBX_RESULT_UNBUFFERED); 
        return $this->result; 
      }else{ 
        return false; 
      } 
    } 

    function fetch($result=""){ 
      if (empty($result)){ $result = $this->result; } 
      return dbx_fetch_row($result); 
    } 

    function __destruct(){ 
      dbx_close($this->link); 
    } 
} 
+0

मुझे वास्तव में इस पर फ़ेच फ़ंक्शन पसंद आया - साथ ही परिणाम को चर के रूप में सहेजना भी पसंद आया। इस इनपुट के लिए धन्यवाद +1 –

+0

-1, भविष्य के उपयोगकर्ताओं के लिए, कभी भी अपनी कॉन्फ़िगरेशन जानकारी को उसी डेटाबेस क्लास में स्टोर न करें। यह सुरक्षित है और पुनः उपयोगिता को भी मार देता है। कॉन्फ़िगरेशन क्लास/पेज बनाएं और कनेक्शन क्लास में उन्हें पास करने के लिए स्थिरांक या कुछ का उपयोग करें। –

9

मैं PDO का उपयोग करने की सलाह देता हूं। वील को पुन: पेश न करें। यह many database engines पर एक अच्छा ओओ-इंटरफ़ेस है। इसके अतिरिक्त मैं एक छोटा सा फ़ंक्शन बनाता हूं जो केवल पीडीओ ऑब्जेक्ट को प्रारंभ करता है। इसलिए सभी कनेक्शन सेटिंग्स को एक ही स्थान पर बदला जा सकता है।

4

आपकी वर्तमान उसका तरीका बिल्कुल मानक है, और अच्छी तरह से काम करता है। मैंने इसे लंबे समय तक इस्तेमाल किया। यह सच है कि पीडीओ जैसे मॉड्यूल इस तरह की मूल कार्यक्षमता प्रदान करते हैं, जो कि बहुत अच्छा है और आपको होम-ब्रू कोड के साथ समस्याओं से दूर ले जा सकता है।

हालांकि, मैंने कनेक्शन प्रबंधन को एक कदम आगे ले लिया है। यदि आप एक जटिल अनुप्रयोग में आते हैं, तो आप ऐसी स्थिति में आ सकते हैं जहां आपके पास एकाधिक डेटाबेस हैं, या भारी डेटाबेस उपयोग है। एक डेटाबेस कनेक्शन फ़ाइल सहित और वैश्विक $database वैरिएबल होने से कई डेटाबेस के लिए अनावश्यक हो जाता है, और यह के लिए अनुरोधों के लिए अनावश्यक है, डेटाबेस कनेक्शन की आवश्यकता नहीं है। याद रखें, डेटाबेस से कनेक्ट करना महंगा है।

मैंने जो किया है वह एक सिंगलटन डेटाबेस मैनेजर क्लास बनाता है जो मेरे लिए डेटाबेस ऑब्जेक्ट को संभालता है, और सुनिश्चित करता है कि किसी दिए गए डीबी को एकाधिक कनेक्शन तत्काल नहीं मिलते हैं। अपने ऐप के शीर्ष पर एक नई डेटाबेस ऑब्जेक्ट शुरू करने के बजाय, जब भी आपको ऑब्जेक्ट की आवश्यकता होती है तो आप बस डेटाबेस प्रबंधक पर कॉल करते हैं।

$db = DatabaseManager::getDatabase(); 

यहां एक उदाहरण वर्ग है जिसे मैंने कोडइग्निटर प्रोजेक्ट के लिए मार दिया था। आप getDatabase() फ़ंक्शन में देख सकते हैं, यदि आप सीआई का उपयोग नहीं कर रहे थे तो यह कोडइग्निटर की डिफ़ॉल्ट डेटाबेस ऑब्जेक्ट को लोड करता है, जिसे आप अपनी कक्षा के लिए प्रतिस्थापित करेंगे (और इसके लिए कनेक्शन दिनचर्या चलाएं)।यह एक बहुत ही सरल प्रबंधन वर्ग है, और इसे विभिन्न डेटाबेसों के लिए कई कनेक्शनों को आसानी से प्रबंधित करने के लिए बढ़ाया जा सकता है।

<?php 

/** 
* Implements the Singleton pattern to prevent multiple instantiations and connections 
* to the application database. 
* 
*/ 
class Database_manager 
{ 
    private static $instance; 
    public $db; 

    /** 
    * Constructor function is declared private to prevent instantiation. 
    * 
    */ 
    protected function __construct() 
    { 
     parent::__construct(); 
    } 

    /** 
    * Returns an instance of a Database_manager. 
    * 
    * @return object Database_manager object 
    */ 
    public static function getInstance() 
    { 
     if (self::$instance == null) { 
      $className = __CLASS__; 
      self::$instance = new $className(); 
     } 
     return self::$instance; 
    } 

    public static function getDatabase() 
    { 
     $instance = self::getInstance(); 
     if ($instance->db == null) { 
      //utilize CodeIgniter's database loader 
      $instance->db = $instance->load->database('',true); 
      if (! is_object($instance->db)) throw new Exception("Could not load database."); 
     } 
     return $instance->db; 
    } 
} 

शायद कनेक्शन प्रबंधन की इस शैली का उपयोग करने से मुझे सबसे आम लाभ मिलता है जब मुझे डेटाबेस रखरखाव के लिए आवेदन करना पड़ता है। जब तक मुझे इसकी आवश्यकता न हो, डेटाबेस कनेक्शन को तुरंत चालू न करके, मैं आसानी से किसी साइट पर "रखरखाव में प्रगति" संदेश डाल सकता हूं (सामान्य सर्किटिंग सामान्य एमवीसी प्रेषण), और रखरखाव के दौरान डीबी कनेक्शन खोलने वाले एप्लिकेशन के अनुरोधों के बारे में चिंता न करें प्रगति।

0

आपके डेटाबेस प्रबंधक उदाहरण में, आपने अपनी कक्षा के लिए अभिभावक को परिभाषित नहीं किया है। इसलिए, माता-पिता का आह्वान :: __ कन्स्ट्रक्टर() एक अपवाद उत्पन्न करता है, और साथ ही, आप कोड इग्निटर की लोड प्रॉपर्टी का उपयोग नहीं कर सकते हैं।

आपने अपने डेटाबेस प्रबंधक के लिए एक्सटेंशन के रूप में किस श्रेणी का उपयोग किया था?

चूंकि मुझे नहीं पता कि आपने अपना डाटाबेससमेटर कोड कहां रखा है, न ही आप जिस वर्ग को अपने माता-पिता के रूप में इस्तेमाल करते हैं, मैंने getDatabase() विधि को एक इनपुट पैरामीटर प्राप्त करके अपवादों को बाधित किया जिसे मैंने $ लोडर कहा था। आम तौर पर, यह $ लोडर ऑब्जेक्ट मॉडल क्लास होगा जो डेटाबेस तक पहुंच की आवश्यकता है।

public static function getDatabase($loader) 
{ 
    $instance = self::getInstance(); 
    if ($instance->db == null) { 
      //utilize CodeIgniter's database loader 
      $instance->db = $loader->load->database('default',true); 
      if (! is_object($instance->db)) throw new Exception("Could not load database."); 
    } 
    return $instance->db; 
} 

सर्वश्रेष्ठ संबंध।