php - pdo 包装器真的太过分了吗?

标签 php pdo

我做了一些关于使用数据库包装器处理我的数据的研究。 但是,我读了一些帖子,其中有人声称您不应该将 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;
    }
}
?>

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

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

最佳答案

据说是因为大多数创建 PDO 包装器的尝试确实无能为力,并且使事情比原始 PDO 更糟。
此外,编写包装器所依据的前提大多是错误的。

让我们来看看你的:

You handle all your data in one class, not spread across your website files.

很模糊的说法,没有什么特别的意思。当然,您在整个应用程序中处理您的数据,但不是使用原始 PDO,而是使用您自己的类。

You can easilly change your class with another databaseclass.

不过是错觉。你实际上不能坚持使用你的两个辅助方法——有时你需要使用原始 PDO 实例。

You don't have to repeat your code, just call the code in the databaseclass

这个是真的。但不像任何其他 API 那样有用。

Optionally you can extend the class with for example logging, statistic tests

这是一个合适的 - 没有异议。

This is a lot more efficiënt than everytime open a connection, perform 3 lines of code and close it.

这是假的。 没有人每次打开一个连接、执行 3 行代码然后关闭它时都会询问您。即使使用原始 PDO 连接也只打开一次。

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

一些建议:

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

关于php - pdo 包装器真的太过分了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20664450/

相关文章:

c# - rsacryptoserviceprovider.VerifyData 总是返回 false

php - Array_merge_recursive 给我重复数据,如何删除它

php - MySQL 到 DB2 通过 ADOdb PHP

php - 自动更改MYSQL中的字段

php - 有没有更好的方法来安全地传递变量而不是准备好的语句?

php - 始终使用值获取 $media

php - 如何使用数组中的所有值获取记录

php - 如何使用 PDO 和 php 正确获取对象

php - 在 PDO 中强类型参数的原因?

mysql - 为什么我会收到语法错误或访问冲突?