gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:37:13 24 4
gpt4 key购买 nike

如果没有指定,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 框架)

最佳答案

您实际上要问的是您的数据库连接是否会根据单例模式建立,答案显然是“否”。如果您在多个地方实例化该类,每个实例都会有自己的资源。因此,这意味着无论您从哪个实例调用 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

请记住,这不是单例模式,我之前告诉过你的模式,也不是好的设计。这只是为了展示 PHP 如何决定使用哪个连接。最后一个示例仅建立一次数据库连接,之后,无论您运行多少查询,它都将使用从实例化类中获得的连接资源。

现在,如果我们修改最后一个示例并将其添加到 index.php 中:

    //index.php
$db2 = new Database();

$db2->query_db($sql);
$db->query_db($sql);

这两个查询都将使用从创建对象 $db2 中获得的资源,因为这将是 PHP 检测到的最后一个。

关于php - 如果未指定 mysql 链接,mysql 函数是否会打开一个新的 mysql 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21546986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com