首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用同一个类的多个单例mysql连接

问使用同一个类的多个单例mysql连接
EN

Stack Overflow用户
提问于 2015-12-27 20:40:31
回答 1查看 1K关注 0票数 2

我有一个PHP应用程序,它使用两个不同的数据库。该连接由一个单例mysql类实现。我想要实现的是使用同一个类,但是根据调用类时声明的变量连接到另一个数据库。因此,使用的代码(但还没有功能):

代码语言:javascript
复制
/ 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)的类时,它都工作得很好,但是当尝试使用第二个数据库时,代码根本帮不了我。

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

代码语言:javascript
复制
public function __construct() {
   $this->connect = Singleton::getconnect(true);
}

有人能帮我弄清楚吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-27 22:25:38

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

现在轮到你的问题了,

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

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

代码语言:javascript
复制
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();

输出:

代码语言:javascript
复制
database has changed
abc
database has changed
def

Sidenote:请不要使用mysql_数据库扩展,它们在PHP5.5.0中被废弃,在PHP7.0.0中被删除。改用mysqli或PDO扩展。这位是 functions。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34484617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档