php - 检索页面内的连接 : PDO and PHP class

标签 php mysql pdo

我也是类(class)和 PDO 的新手。我正在尝试编写一个具有单独函数的类,用于连接到数据库并关闭连接,以便在页面中,我可以:

  1. 使用 $db->connOpen 打开连接
  2. 在页面内执行我需要的所有查询
  3. 使用 $db->connClose 在脚本末尾关闭连接

    class database
    {
        private $host       = '';
        private $db_name    = '';
        private $charset    = '';
        private $username   = '';
        private $password   = '';
    
    
        public function setHost($host) {
            $this->host = $host;
        }
    
        public function setDbName($db_name) {
            $this->db_name = $db_name;
        }
    
        public function setUser($username, $password) {
            $this->username = $username;
            $this->password = $password;
        }
    
    
        public function connOpen() {
            try {
                $dsn    = "mysql:host=$this->host;dbname=$this->db_name;charset=$this->charset";
                $db     = new PDO($dsn, $this->username, $this->password, array(PDO::ATTR_PERSISTENT => true));
                $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                echo $e->getMessage();
            }
        }
    
        public function connClose() {
            $db = null;
        }
    }
    

我猜问题更多的是类语法而不是 PDO,因为要在页面中触发如下查询,我需要再次实例化类 PDO,将连接加倍数据库。

$stmt = $dbo->prepare('SELECT * FROM products WHERE id=:id');
$stmt->execute(array(':id' => $id));
$res  = $stmt->fetchAll(PDO::FETCH_ASSOC);

我的问题是:

  1. 如何使用上面这样的类来实现我想要的效果?
  2. 在本例中,使用持久连接是否正确?

谢谢

最佳答案

出于某种原因,大多数想要学习 OOP 的人都是从实现单例并干扰错误处理的数据库包装器开始。

我的建议是,将数据库连接视为任何其他变量:

class Post {
    function getByUserId(PDO $connection, $user_id) {
    }
}

$database = new PDO(...);
$post->getByUserId($database, 123);

这称为依赖注入(inject)。

并且不要浪费时间和精力编写代码来避免使用有用的功能,例如:

  • 集中错误处理
  • 能够连接到多个数据库

只有当您确实有真正的功能要添加到 PDO 之上时,才关心编写数据库包装器。我能想到的是:

  • 自动将日期转换为 DateTime 对象
  • 将所有查询传递给记录器
  • 对有趣的事件抛出自定义异常,例如重复索引违规

...即使如此,也要非常小心,不要让 PDO 变得更糟;-)

关于php - 检索页面内的连接 : PDO and PHP class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504869/

相关文章:

javascript - 在 jQuery $.each 中访问 JSON 中的多个对象/数组

php - Laravel 数据库外键

PHP/PDO : use simple prepared statement with query return/affected rows?

php - 如何将多个复选框值插入到表中

php - $query -> 从用户处获取所有 'friends',有效,但每个 friend 都会获得两倍

php - enctype ="multipart/form-data"和 enctype ="multipart/form-data;charset=utf-8"有什么区别

php - 如何使用一个用户名多个提交按钮?

mysql - 如何在触发器PL/SQL中拆分设置值并插入每一行?

php - 如何使我的 CMS 多语言化

php - 在 PDO SQL 语句中使用 PHP 变量时出现问题