我有一个PHP应用程序,它使用两个不同的数据库。该连接由一个单例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);
}有人能帮我弄清楚吗?谢谢!
发布于 2015-12-27 22:25:38
问题是,在对象的构造过程中(在__construct()方法中),您要选择数据库,并且它完全基于类成员变量$dbc。因此,下次您想要更改数据库时,必须像这样调用getconnect()方法,Singleton::getconnect(true);,然后创建另一个对象来更改数据库,这将最终达到单例模式的目的。因此,基本上,每次更改数据库时,都必须使用true和false参数交替调用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
defSidenote:请不要使用mysql_数据库扩展,它们在PHP5.5.0中被废弃,在PHP7.0.0中被删除。改用mysqli或PDO扩展。这位是 functions。
https://stackoverflow.com/questions/34484617
复制相似问题