如果没有指定
mysql_query,
mysql_real_escape或mysql_error等函数会打开一个新的mysql链接吗?
php.net说
The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed
但是如果连接是在一个类中进行的呢? php知道如何找到该链接吗?
(如果有任何帮助,我正在使用codeigniter框架)
最佳答案 您实际要问的是,您是否将根据Singleton模式建立数据库连接,答案显然是“不”.如果在多个位置实例化该类,则每个实例都将拥有自己的资源.因此,这意味着无论您调用mysql_query的实例如何,它都将使用将被检测到的最后一个实例,该实例实际上是在您进行连接的类的上一次实例化期间创建的.
[稍后编辑]
如果你有类似的东西,你会遇到这种情况:
//Database.class.php
class Database {
public function connect_db() {
//connection logic here
}
public static function query_db($query) {
$this->connect_db();
//query database logic here
}
}
//index.php
include "path/to/Database.class.php";
$sql = "SELECT * FROM `whatever_i_want`";
Database::query_db($sql);
//repeat the last two lines multiple times
现在,这是糟糕的设计.在这种情况下,每次查询数据库时都将实例化一个连接.为避免这种情况,以下小改动应该可以解决问题:
//Database.class.php
public function __construct() {
$this->connect_db();
}
public function query_db($query) {
//query database logic here
//note the missing call to connect_db()
}
//the rest remains unchanged
//index.php
$db = new Database();
$db->query_db($sql);
//the rest remains unchanged
请记住,这不是Singleton,我之前告诉过你的模式,也不是好设计.这只是为了展示PHP如何决定使用哪个连接.
最后一个示例只使数据库连接一次,之后,无论运行多少查询,它都将使用从实例化类中获得的连接资源.
现在,如果我们修改最后一个示例,我们将其添加到index.php:
//index.php
$db2 = new Database();
$db2->query_db($sql);
$db->query_db($sql);
两个查询都将使用从创建对象$db2获得的资源,因为这将是PHP将检测到的最后一个.