php – 如果未指定mysql链接,mysql函数是否会打开一个新的mysql连接?

如果没有指定
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将检测到的最后一个.

点赞