pdo包装真的有点过分吗?

Bar*_* L. 14 php pdo

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

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

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

例:

<?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;
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

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

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

You*_*nse 7

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

我们带你的:

您可以在一个类中处理所有数据,而不是分布在您的网站文件中.

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

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

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

您不必重复代码,只需调用数据库类中的代码即可

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

您可以选择使用例如日志记录,统计测试来扩展该类

这是正确的 - 没有异议.

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

这是假的.没有人问你每次打开一个连接,执行3行代码,并将其关闭.即使原始PDO连接只打开一次.

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

一些建议:

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