PHP面向对象实现双MySQL数据库连接问题求助
解决PHP同时连接两个数据库的问题
嘿,这个问题我之前踩过坑!你遇到的情况是因为mysql_connect的连接复用机制,再加上你没有把连接句柄保存为类的属性,导致后续操作默认只会使用最后创建的连接。咱们一步步来解决:
先修复你现有代码的问题(注意:mysql_*扩展已废弃)
首先,你需要把两个连接资源保存为类的成员变量,这样后续执行查询时才能明确指定用哪个连接。另外,mysql_connect的第四个参数true是对的——它强制创建新连接而不是复用已有的,但关键是要把连接句柄存下来:
<?php class ConOs{ // 新增两个属性保存连接句柄 var $conn1; var $conn2; var $dbhost1; var $dbuser1; var $dbpass1; var $dbhost2; var $dbuser2; var $dbpass2; function __construct() { } function connect(){ $this->dbhost1="localhost"; $this->dbuser1="user1"; $this->dbpass1="db1"; $this->dbhost2="localhost"; $this->dbuser2="user2"; $this->dbpass2="db2"; // 保存第一个连接到类属性 $this->conn1 = mysql_connect($this->dbhost1, $this->dbuser1, $this->dbpass1); if(! $this->conn1 ){ die('Could not connect to db1: ' . mysql_error()); } mysql_select_db("db1", $this->conn1); // 第四个参数true强制创建新连接,同样保存到类属性 $this->conn2 = mysql_connect($this->dbhost2, $this->dbuser2, $this->dbpass2, true); if(! $this->conn2 ){ die('Could not connect to db2: ' . mysql_error()); } mysql_select_db("db2", $this->conn2); } // 示例:查询db1的方法 function queryDb1($sql){ return mysql_query($sql, $this->conn1); } // 示例:查询db2的方法 function queryDb2($sql){ return mysql_query($sql, $this->conn2); } } ?>
这样,当你需要操作某个数据库时,只要在mysql_query里指定对应的连接句柄($this->conn1或$this->conn2),就能分别操作两个数据库了。
更推荐的方案:使用mysqli扩展(面向对象写法)
mysql_*系列函数在PHP 5.5就被废弃了,PHP 7之后直接移除了,安全性和维护性都很差,强烈建议换成mysqli。下面是用mysqli面向对象实现的版本:
<?php class ConOs{ private $conn1; private $conn2; public function __construct() { // 构造函数里直接初始化连接,更符合面向对象 $this->connectDb1(); $this->connectDb2(); } private function connectDb1(){ $dbhost = "localhost"; $dbuser = "user1"; $dbpass = "db1"; $dbname = "db1"; $this->conn1 = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if ($this->conn1->connect_error) { die("连接db1失败: " . $this->conn1->connect_error); } } private function connectDb2(){ $dbhost = "localhost"; $dbuser = "user2"; $dbpass = "db2"; $dbname = "db2"; $this->conn2 = new mysqli($dbhost, $dbuser, $dbpass, $dbname); if ($this->conn2->connect_error) { die("连接db2失败: " . $this->conn2->connect_error); } } // 查询db1 public function queryDb1($sql){ return $this->conn1->query($sql); } // 查询db2 public function queryDb2($sql){ return $this->conn2->query($sql); } // 记得关闭连接(可选,PHP会自动关闭,但手动关闭更规范) public function closeConnections(){ $this->conn1->close(); $this->conn2->close(); } } ?>
最优方案:使用PDO(支持多数据库,更灵活)
如果以后可能切换数据库类型(比如从MySQL到PostgreSQL),PDO是更好的选择,它是PHP的数据库抽象层,支持多种数据库,而且自带预处理语句防SQL注入:
<?php class ConOs{ private $pdo1; private $pdo2; public function __construct() { $this->connectDb1(); $this->connectDb2(); } private function connectDb1(){ $dsn = "mysql:host=localhost;dbname=db1;charset=utf8mb4"; $username = "user1"; $password = "db1"; try { $this->pdo1 = new PDO($dsn, $username, $password); $this->pdo1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("连接db1失败: " . $e->getMessage()); } } private function connectDb2(){ $dsn = "mysql:host=localhost;dbname=db2;charset=utf8mb4"; $username = "user2"; $password = "db2"; try { $this->pdo2 = new PDO($dsn, $username, $password); $this->pdo2->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("连接db2失败: " . $e->getMessage()); } } // 查询db1 public function queryDb1($sql, $params = []){ $stmt = $this->pdo1->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(PDO::FETCH_ASSOC); } // 查询db2 public function queryDb2($sql, $params = []){ $stmt = $this->pdo2->prepare($sql); $stmt->execute($params); return $stmt->fetchAll(PDO::FETCH_ASSOC); } } ?>
总结一下:你的核心问题是没有保留连接句柄,导致后续操作默认使用最后一个连接。但更重要的是要放弃已经废弃的mysql_*函数,改用mysqli或PDO,这不仅能解决当前问题,还能提升代码的安全性和可维护性。
内容的提问来源于stack exchange,提问作者Nidhi
相关产品推荐
相关产品推荐

