我有一个使用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);
}
有人可以帮我搞清楚吗? 谢谢!
答案 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中删除。请改用mysqli
或PDO
扩展程序。这是why you shouldn't use mysql_
functions。