2011-10-17 23 views
6

मैं सिर्फ एक बार डेटाबेस (MySQLi) से कनेक्ट करने का प्रयास कर रहा हूं, लेकिन मुझे ऐसा करने में समस्याएं आ रही हैं।वैश्विक परिवर्तनीय - डेटाबेस कनेक्शन?

मैं संपूर्ण स्क्रिप्ट के लिए वैश्विक कनेक्शन कैसे बना सकता हूं? कई फाइलें हैं (index.php, /classes/config.class.php, /classes/admin.class.php, आदि)।

मैं कोशिश की है निम्नलिखित:

में: config.class.php

public static $config = array(); 
public static $sql; 

function __construct() { 
    // database 
    db::$config['host'] = 'localhost'; 
    db::$config['user'] = '_'; 
    db::$config['pass'] = '_'; 
    db::$config['db'] = '_'; 

    // connect 
    db::$sql = new mysqli(db::$config['host'], db::$config['user'], db::$config['pass'], db::$config['db']); 
} 

फिर, config.class.php में

public function contectToDatabase($sql){ 
    $sql = new mysqli(db::$config['host'], db::$config['user'], db::$config['pass'], db::$config['db']); 
    $this->sql = $sql; 
} 

मैं के साथ वर्ग का उपयोग निम्नलिखित कोड: $config = new db();

मैं वास्तव में एक परेशान हूँ मैं यह कैसे करूँगा। क्या कोई मदद कर सकता है?

--- संपादित करें --- यह मेरा नया config.class.php फ़ाइल है:

public static $config = array(); 
public static $sql; 

private static $db; 
private $connection; 

public function __construct() { 
    // database 
    db::$config['host'] = '_'; 
    db::$config['user'] = '_'; 
    db::$config['pass'] = '_'; 
    db::$config['db'] = '_'; 
    // connect 
    $this->connection = new mysqli(db::$config['host'], db::$config['user'], db::$config['pass'], db::$config['db']); 
} 
function __destruct() { 
    $this->connection->close(); 
} 
public static function getConnection() { 
    if($db == null){ 
     $db = new db(); 
    } 
    return $db->connection; 
} 

और यह मैं इसे कैसे लोड हो रहा है कर रहा हूँ है:

require_once("classes/config.class.php"); 
$config = new db(); 
$sql = db::getConnection(); 

हालांकि, चल निम्न त्रुटियों में एक real_escape_string परिणाम:

Warning: mysqli::real_escape_string() [mysqli.real-escape-string]: Couldn't fetch mysqli in /home/calico/_/_.com/_/index.php on line 20 

Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in /home/calico/_/_.com/_/index.php on line 28 
+1

आप [सिंगलटन पैटर्न] (http://en.wikipedia.org/wiki/Singleton_pattern) – knittl

+1

का उपयोग कर सकते हैं या आप [सिंगलटन एंटीपाटरर्न] का उपयोग करने के बजाय निर्भरता इंजेक्शन सीख सकते हैं (http://stackoverflow.com/ प्रश्न/45 9 5 9 64/कौन-जरूरत-सिंगलेट्स/4596323 # 4596323) – Gordon

+1

हाँ ... सिंगलेट्स हमेशा गर्म बहस में परिणाम देते हैं। मैं केवल इनपुट और विचार दे रहा था – knittl

उत्तर

14

व्यक्तिगत रूप से, मैं एक सिंगलटन वर्ग का उपयोग करें। इस तरह कुछ:

<?php 

class Database { 

    private static $db; 
    private $connection; 

    private function __construct() { 
     $this->connection = new MySQLi(/* credentials */); 
    } 

    function __destruct() { 
     $this->connection->close(); 
    } 

    public static function getConnection() { 
     if (self::$db == null) { 
      self::$db = new Database(); 
     } 
     return self::$db->connection; 
    } 
} 

?> 

तब कहीं भी $db = Database::getConnection(); का उपयोग करें जहां मुझे इसकी आवश्यकता है।

+0

आपका सिंगलटन क्रमबद्ध और क्लोन किया जा सकता है जिसका अर्थ है कि यह सुनिश्चित नहीं करता है कि केवल एक उदाहरण है। – Gordon

+0

ठीक है, मैंने इसे कॉन्फ़िगर क्लास में जोड़ा है, और इसे लोड करने का प्रयास किया है। हालांकि, त्रुटियां हैं (मुख्य पोस्ट देखें, --- --- --- --- --- के अंतर्गत)। कोई विचार क्या गलत है? – Peter

+1

@ पीटर इसे किसी अन्य श्रेणी में न जोड़ें। यह एक सिंगलटन वर्ग है जो अकेले रहना चाहिए और सार्वजनिक कन्स्ट्रक्टर नहीं होना चाहिए। जहां भी आपको इसकी आवश्यकता हो, खुले MySQLi इंस्टेंस को प्राप्त करने के लिए बस '$ db = डेटाबेस :: getConnection();' का उपयोग करें। – megaflop

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