我已经做过一些关于为我的数据使用databasewrapper的研究。 但是,我读了一些帖子,人们声称你不应该将PDO用于数据库包装器,因为它已经是一个。
可能是这样,但我仍然相信它有很多好处。
示例:
<?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));
答案 0 :(得分:7)
据说是因为大多数创建PDO包装器的尝试确实无能为力,并且比使用原始PDO更糟糕。
还有一个前提,一个是根据它来编写包装,大多是错误的。
让我们带你的:
您可以在一个班级处理所有数据,而不是在您的网站文件中传播。
相当模糊的陈述,没有特别的意义。当然,您可以在整个应用程序中处理您的数据,但不使用原始PDO,而是使用您自己的类。
您可以轻松地使用其他数据库类更改您的课程。
但是妄想。您实际上无法坚持使用两种辅助方法 - 有时您需要使用原始PDO实例。
您不必重复代码,只需调用databaseclass中的代码
即可
这个是真的。但与其他任何API一样没用。
您可以选择使用例如日志记录,统计测试
扩展该类
这是正确的 - 没有异议。
这比每次打开连接,执行3行代码并关闭它更有效率。
这是假的。 没有人每次都会打开一个连接,执行3行代码并关闭它。即使原始PDO连接只打开一次。
但是,您的实施非常好。它不会给原始PSO增加太多(实际上,它只会将重复时间缩短一行)但仍然是明智的。所以 - 我称这种方法相当成功。
一些建议:
答案 1 :(得分:2)
'Overkill'是主观的。这是你决定你的具体情况。表现方面,我怀疑你是否注意到任何差异。
做这样的事情有一些可能的好处。例如,您可以将查询概要分析和应用程序日志记录嵌入到类中。而且,正如您所指出的,您可以选择以最容易使用和维护的方式构建查询。
另一方面,如果代码依赖于你的包装类,那么代码的可移植性会降低。然后你不能使用该代码并将其与依赖于PDO的代码一起使用。您可以通过扩展PDO类来解决其中一些限制,而不是为它创建包装器。