pdo包装真的有点过分吗?

时间:2013-12-18 17:20:48

标签: php pdo

我已经做过一些关于为我的数据使用databasewrapper的研究。 但是,我读了一些帖子,人们声称你不应该将PDO用于数据库包装器,因为它已经是一个。

可能是这样,但我仍然相信它有很多好处。

  1. 您在一个类中处理所有数据操作(crud),而不是遍布您的网站文件。因此,调试和处理错误要容易得多。
  2. 您可以轻松地使用其他数据库类更改您的课程。
  3. 您不必重复代码,只需调用databaseclass中的代码
  4. 即可
  5. 您可以选择使用例如日志记录,统计测试,...
  6. 扩展该类

    示例:

    <?php
    class Database
    {
        public $connection; 
        private $host = "";
        private $username = "";
        private $password = "";
        private $dbname = "";
    
        public function __construct(){      
            $this->connection = new PDO("mysql:host=$this->host;dbname=$this->dbname",$this->username,$this->password,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
    
        public function insert($query, array $data){        
            $this->connection->prepare($query)->execute($data);     
            return $this->connection->lastInsertId();
        }
    
        public function update($query, array $data) {
            $stmt = $this->executeQuery($query,$data);
            return $stmt->rowCount();       
        }
    
        public function delete($query, array $data) {
            $stmt = $this->executeQuery($query,$data);
            return $stmt->rowCount();       
        }
    
        public function findOne($query, array $data = null){        
            $stmt = $this->executeQuery($query,$data);          
            return $stmt->fetchObject();
        }
    
        public function findMany($query, array $data = null){
            $stmt = $this->executeQuery($query,$data);
            return($stmt->fetchAll(PDO::FETCH_OBJ));
        }
    
        public function executeQuery($query,$data = null){
            $stmt = $this->connection->prepare($query);
            $stmt->execute($data);
            return $stmt;
        }
    }
    ?>
    

    您可以调用get()并传递查询和一些可选参数,而不是不断重复检索数据的所有步骤。 这比每次打开连接,执行3行代码并关闭它都要高效得多。

    $db->get("select * from user where id = ?",array(1));
    

2 个答案:

答案 0 :(得分:7)

据说是因为大多数创建PDO包装器的尝试确实无能为力,并且比使用原始PDO更糟糕。
还有一个前提,一个是根据它来编写包装,大多是错误的。

让我们带你的:

  

您可以在一个班级处理所有数据,而不是在您的网站文件中传播。

相当模糊的陈述,没有特别的意义。当然,您可以在整个应用程序中处理您的数据,但不使用原始PDO,而是使用您自己的类。

  

您可以轻松地使用其他数据库类更改您的课程。

但是妄想。您实际上无法坚持使用两种辅助方法 - 有时您需要使用原始PDO实例。

  

您不必重复代码,只需调用databaseclass中的代码

即可

这个是真的。但与其他任何API一样没用。

  

您可以选择使用例如日志记录,统计测试

扩展该类

这是正确的 - 没有异议。

  

这比每次打开连接,执行3行代码并关闭它更有效率。

这是假的。 没有人每次都会打开一个连接,执行3行代码并关闭它。即使原始PDO连接只打开一次。

但是,您的实施非常好。它不会给原始PSO增加太多(实际上,它只会将重复时间缩短一行)但仍然是明智的。所以 - 我称这种方法相当成功。

一些建议:

  1. 将数据库凭据存储为类属性确实没有意义。他们只需要构造函数而不是其他地方
  2. 为什么不在构造函数中创建连接,而不需要额外的方法?
  3. 公共函数getOne()将是你的集合中不可或缺的补充。
  4. 您需要公开$ connection - 至少在您从PDO和PDOstatement中提供所有方法之前

答案 1 :(得分:2)

'Overkill'是主观的。这是你决定你的具体情况。表现方面,我怀疑你是否注意到任何差异。

做这样的事情有一些可能的好处。例如,您可以将查询概要分析和应用程序日志记录嵌入到类中。而且,正如您所指出的,您可以选择以最容易使用和维护的方式构建查询。

另一方面,如果代码依赖于你的包装类,那么代码的可移植性会降低。然后你不能使用该代码并将其与依赖于PDO的代码一起使用。您可以通过扩展PDO类来解决其中一些限制,而不是为它创建包装器。