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 数据库连接被重复,这是正常行为吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

制作 PDO mysql 静态连接类的最佳方法?

在 php 中使用 PDO 类获取 num_rows 的问题

使用 PDO 准备好的语句 MySQL 错误

PHP pdo 实例作为私有静态属性

php+mysql 请问:用pdo如何获取某个表中记录的数目?

PHP实现的pdo连接数据库并插入数据功能简单示例