使用相同类的多个Singleton mysql连接

时间:2015-12-27 20:40:32

标签: php mysql

我有一个使用2个不同数据库的PHP应用程序。连接由singleton mysql类实现。我想要实现的是使用相同的类,但根据调用类时声明的变量连接到另一个数据库。 所以,使用的代码(但尚未起作用):

/ start the single class
class Singleton {

// declare two private variables
private static $_instace;
private $conn;
var $dbc = 0;

// declare private constructor class
private function __construct() {
    $this->conn = mysql_connect(HOST, USER, PASS);
    //die('DB State: [' . $this->dbc . ']');
    if ($this->dbc) {
       mysql_select_db(DB_DATABASE_PS);
    } else {
       mysql_select_db(DBNAME);
    }
}

// create a singleton method
public static function getconnect($dbc = false) {
    if (!self::$_instace) {
        self::$_instace = new Singleton();   
        $_instace->dbc = $dbc;  
    } else {
        $_instace->dbc = $dbc;  
    }
    return self::$_instace;
}
}

当调用使用第一个数据库(DBNAME)的类时,一切都很完美,但在尝试使用第二个数据库时,代码根本无法帮助我。

通过以下代码创建在新类中加载第二个数据库的代码:

public function __construct() {
   $this->connect = Singleton::getconnect(true);
}

有人可以帮我搞清楚吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

问题是,您在构造对象期间(在__construct()方法中)选择了数据库,并且它完全基于类成员变量$dbc。因此,下次要更改数据库时,必须调用getconnect()这样的方法,Singleton::getconnect(true);,然后创建另一个对象来更改数据库,这最终会破坏单例模式的目的。所以基本上,每次更改数据库时,都必须使用getconnect()true参数调用false方法,并创建一个新对象来更改数据库。

现在归结为你的问题,

  

我应该如何使用它(单例类)在数据库之间进行更改,请记住,在单个页面上可能存在来自两个数据库的数据

使用以下代码段实现单例模式并使用单个对象更改数据库。

class Singleton {

    // declare two private variables
    private static $instance;
    private $conn;

    // Since it's constructor method is private
    // it prevents objects from being created from 
    // outside of the class
    private function __construct() {}

    // It creates an object if not previously created,
    // opens a connection to MySQL Server
    // and returns the object
    public static function getInstance() {
        if(!isset(self::$instance)){
            self::$instance = new Singleton();
            self::$instance->conn = mysql_connect(HOST, USER, PASS);
        }
        return self::$instance;
    }

    // set your database here
    public function setDatabase($db){
        return mysql_select_db($db, $this->conn);
    }

    // Execute your query here
    public function executeQuery($query){
        return mysql_query($query, $this->conn);
    }

    // Close your connection here
    public function closeConnection(){
        mysql_close($this->conn);
    }

}

// Get an instance of Singleton class
$obj = Singleton::getInstance();

// Set database "abc"
if($obj->setDatabase("abc")){
    echo "database has changed <br />";
}else{
    echo "database has not changed <br />";
}

// Display the selected database
$resultset = $obj->executeQuery("SELECT DATABASE() as db");
$row=mysql_fetch_assoc($resultset);
echo $row['db'] . "<br />";

// Set database "def"
if($obj->setDatabase("def")){
    echo "database has changed <br />";
}else{
    echo "database has not changed <br />";
}

// Display the selected database
$resultset = $obj->executeQuery("SELECT DATABASE() as db");
$row=mysql_fetch_assoc($resultset);
echo $row['db'] . "<br />";

// close connection
$obj->closeConnection();

输出:

database has changed
abc
database has changed
def

旁注:请不要使用mysql_数据库扩展,它们在PHP 5.5.0中已弃用,并已在PHP 7.0.0中删除。请改用mysqliPDO扩展程序。这是why you shouldn't use mysql_ functions