PHP - PDO OOP MySQL 数据库连接被重复,这是正常行为吗? [复制]
Posted
技术标签:
【中文标题】PHP - PDO OOP MySQL 数据库连接被重复,这是正常行为吗? [复制]【英文标题】:PHP - PDO OOP MySQL database connection is being repeated, is that a normal behavior? [duplicate] 【发布时间】:2020-03-15 03:00:11 【问题描述】:我正在使用这样的数据库连接类...
class Dbh
private $host;
private $dbName;
private $password;
private $dbUser;
private $charset;
protected function connect ()
$this->host = 'localhost';
$this->dbName = 'test';
$this->password = '';
$this->dbUser = 'root';
$this->charset = 'utf8mb4';
try
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbName . ';charset=' . $this->charset;
$pdo = new PDO($dsn, $this->dbUser, $this->password);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $pdo;
catch (PDOException $exception)
$message = 'Connection failed:' . $exception->getMessage();
return $message;
...如果我回显try
例如echo 'Connected';
并打电话给例如...
$user = new User();
$users = $user->getAllUsers();
$update = $user->updateUser();
$insert = $user->insertUsers();
它将在一个页面上输出 3 次“已连接”,它应该只输出一次,因为 1 个连接就足够了。
如何解决这个问题?
【问题讨论】:
User
用户类只是一个简单的$stmt = $this->connect()->query('SELECT * FROM users');
以及我在索引页面上输出的用于测试目的的查询
所以你在每个查询上都调用->connect()
。从逻辑上讲,您将在每个查询上再次连接。我对这里的混乱感到困惑。
这可能是 singleton 设计模式的一个很好的用例 - phpenthusiast.com/blog/the-singleton-design-pattern-in-php
当然不是,不正常。您是否每次需要乘车时都购买新车?可能不是。为什么每次要运行查询时都有连接数据库的想法?接受的答案只是将问题扫到了地毯下。它不仅使用户成为数据库的后代(相当奇怪的祖先),而且还保持了每次需要运行查询时连接的习惯。鉴于您只是在学习并且没有要保留的遗留代码,因此接受的答案是故意伤害。
【参考方案1】:
一个简单的解决方法是将连接设置为类变量并检查它。所以connect()
仍然可以从User
调用多次,但只有一个实际连接。简化:
class Dbh
private $pdo = null;
protected function connect ()
if($this->pdo === null)
$this->pdo = new PDO($dsn, $this->dbUser, $this->password);
return $this->pdo;
这只会为$user = new User();
的实例连接一次,但如果它扩展了Dbh
类,它将再次为$cart = new Cart()
等连接。
如果从头开始有更好的方法,可能是Singleton Pattern,但这样你只需要修改Dbh
,而不需要重构所有其他类。
【讨论】:
查看编辑,单例会更好。 是的,我从头开始,并试图为 pdo oop 获得正确的数据库连接以上是关于PHP - PDO OOP MySQL 数据库连接被重复,这是正常行为吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
在 php 中使用 PDO 类获取 num_rows 的问题