如何在每个方法中引用数据库连接而不是冗余[重复]

Posted

技术标签:

【中文标题】如何在每个方法中引用数据库连接而不是冗余[重复]【英文标题】:How to reference DB connection inside each method without being redundant [duplicate] 【发布时间】:2022-01-21 13:56:10 【问题描述】:

OOP php 和 PDO 的新手。这不是生产代码,仅供本地练习。

我有一门课,我想在其中放置我所有的 CRUD 操作。该类扩展了数据库连接类,并且还需要该文件。

这是我在 CRUD 类中构建的第一个方法,它插入一个用户。

protected function insertUser()

        $connectionvar = new PDO('mysql:host='. $this->host .';dbname='.$this->db, $this->user, $this->password);
        //all remaining code for the method
        

上面的方法词很好,并按预期插入用户,但我觉得我不应该为每个方法编写 $connectionvar 变量,这是多余的。只是不确定如何在不这样做的情况下访问数据库连接。对于其他上下文,此文件所需的数据库连接类在需要该文件时自动创建一个 db 连接(正如我所做的那样)。

必须有一种方法可以做到这一点而无需重复该代码,有什么想法吗?

【问题讨论】:

【参考方案1】:

首先,正确使用术语是很好的,这样您就不会混淆自己和他人:$connectionvar 不是属性,而是局部变量; $this->host 一个属性。

其次,每次调用new PDO 时,您都在创建与数据库的新连接。您说您有一个“自动创建数据库连接”的文件,但是如果您没有将该连接存储在某个地方以供以后使用,那将是无用的 - 您只是在浪费额外的连接资源。

解决方案是运行new PDO一次,然后将结果存储在属性中。通常不是在您包含文件时,而是在您创建一个对象时 - 所以,您会有这样的东西:

class DB 
    protected PDO $connection;

    public function __construct(string $host, string $db, string $user, string $password) 
        $this->connection = new PDO('mysql:host='. $host .';dbname='.$db, $user, $password);
   

然后在DB 类以及extends DB 中的任何内容中,您可以访问$this->connection 来获取现有数据库连接,而无需创建新连接。

请注意,每个扩展 DB 的类仍然会打开自己的连接,因为它会在您创建它时运行自己继承的构造函数副本。因此,最好的结构是只有一个类实际上数据库对话,并具有运行查询的公共方法,例如:

public function runQueryAndGetResult(string $sql, array $parameters): array 
    $statement = $this->connection->prepare($sql);
    $statement->execute($parameters);
    return $statement->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

以上是关于如何在每个方法中引用数据库连接而不是冗余[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何显示两位数而不是一个 Twig [重复]

使用引用库的 app.config 设置 [重复]

mysql 注意点

如何按值而不是按引用复制对象[重复]

彻底掌握连接池技术,使系统速度提升数十倍​!

在每个进程中测试一个数字是否为4GB集的成员,而不重复集