如何在每个方法中引用数据库连接而不是冗余[重复]
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);
【讨论】:
以上是关于如何在每个方法中引用数据库连接而不是冗余[重复]的主要内容,如果未能解决你的问题,请参考以下文章