如果没有指定像mysql_query、mysql_real_escape或mysql_error这样的函数,是否打开一个新的mysql链接?
php.net说
MySQL连接。如果未指定链接标识符,则假定mysql_connect()打开的最后一个链接
但是如果连接是在类内建立的呢?php知道如何找到这个链接吗?
(如果有任何帮助的话,我使用的是代码点火器框架)
发布于 2014-02-04 08:48:03
实际上,您要问的是,您的数据库连接是否与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将检测到的最后一个查询。
https://stackoverflow.com/questions/21546986
复制相似问题