关闭。这个问题是opinion-based .它目前不接受答案。
想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.
6年前关闭。
Improve this question
经典的第一类轮 - 在 SO 上看到过类似的问题,但没有一个能真正帮助我理解我所处的十字路口。
代码前的一点背景知识 - 我对 PHP 或 PDO 并不陌生(尽管也不是专家),但我是面向对象 PHP 的完全新手,我试图在何时使用类和何时使用类之间取得平衡矫枉过正。
我希望的答案分为两部分。首先,在使用 PDO 时创建一个包装数据库类是一种很好的做法——用于连接、基本查询等。
其次,如果没有 - 是否有更好的方法来加快查询编写速度?
编辑 虽然我质疑下面的代码,但实际上我质疑 PDO 包装器类的整体方法 - 所以下面的类可能比这大得多,但有什么需要/好处吗?
见以下代码;
注意 : 类文件通过 config.php 中的 spl_autoload_register() 调用
class_database.php
class Database
{
private $conn;
public function __construct() {
$this->openConnection();
}
public function openConnection() {
try {
$this->conn = new PDO('mysql:host=' . DB_SERVER . '; dbname=' . DB_NAME, DB_USER, DB_PASS);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'There was an error connecting to the database, Error: ' . $e->getMessage();
die();
}
}
public function getAll($sql, array $params) {
$stmt = $this->conn->prepare($sql);
$stmt->execute($params);
return $stmt->fetch(PDO::FETCH_ASSOC);
}
}
generic_file.php
require_once '../includes/config.php';
$dbh = new Database();
$sql = ("SELECT * FROM users where id = :id and username = :username");
$id = 1;
$username = 'craig';
$params = array(':id' => $id,
':username' => $username);
$row = $dbh->getAll($sql, $params);
var_dump($row);
现在,对我来说,这似乎完全没有意义。单独使用 PDO,而不是包装类,这个查询编写起来也很简单。最重要的是——如果我想使用不同的获取方法怎么办——我必须在类中编写更多的方法。
另外,以前我使用一个简单的函数来实例化并返回一个新的 PDO 对象,只需包含该文件并将一个变量分配给函数返回就很简单了——我再次觉得类方法是多余的。
另外,使用上面的代码,并通过在一个类中执行此操作,我是否不会失去“准备”语句的好处,因为我每次都必须传递 sql 语句,即使只是为了更改同一语句的变量?
但是,我在网上找到了很多关于数据库包装类的示例,尤其是在我目前使用的 Lynda.com 上。最重要的是-我不是专家,因此我觉得矫枉过正的做法实际上可能是最佳实践并强烈推荐,因此请各位专家帮助我!
所以......回到我的问题 - 在使用 PDO 时是否有充分的理由使用这样的类?
如果没有,是否有其他人使用另一种 DRY 方法来最小化使用 PDO 进行查询所需的代码行?
提前致谢。
最佳答案
我曾经有过你同样的问题。
将数据库抽象出来的好处是您可以确保正确建立所有连接,并且如果您确实需要更改数据库的类型,则只需更改一个地方的代码。它还使检查发出的查询变得更容易,因为您知道如果您在类中回显并退出,所有查询都将能够被检查。
我解决它的方法是创建一个类,构造函数在其中建立连接并将其分配给私有(private)变量,同时也在数据库中设置表。
最好的方法是使用一些公共(public)函数来创建、检索、更新和删除。有时称为 CRUD。
对于每个函数,唯一的第一个参数是一个数组。为了创建它,它需要数组并用它创建一个准备好的语句,然后执行它。
它与其他人做的事情非常相似,但是对于检索数组是匹配的内容,对于更新它需要以 id 结尾的东西并将其余部分设置为更新 id = 提供的位置,对于删除它删除所有表中的键 = 值。
编辑:
这是我放在类里面的删除功能。如果参数的值之一是数组,它将准备语句并循环遍历它。不过,这仅适用于一个变量的变化。您也可以在其中传递一个数组,其中数字索引的值是您想要插入的数组,尽管这不是我设置代码的方式。
public function delete($info) {
$dbh = $this->dbh;
if (isset($info['submit_action'])) unset($info['submit_action']);
$where = array();
foreach (array_keys($info) as $name) {
$where[] .= "$name = :$name";
}
//echo "DELETE FROM {$this->table_name} WHERE " . implode(" AND ", $where) . ";"; exit;
$data = $dbh->prepare("DELETE FROM {$this->table_name} WHERE " . implode(" AND ", $where) . ";");
foreach ($info as $name => $value) {
if ($array_value == $name) $data->bindParam(":$name", $array_info);
else $data->bindValue(":$name", trim($value));
}
foreach ($info as $name => $value) if (is_array($value)) { $array_value = $name; break; }
if (isset($array_value)) {
foreach ($info[$array_value] as $array_info) {
try {
$data->execute();
}
catch (PDOException $e) {
if (!is_null($this->error_msg))
handle_error($this->error_msg, $e->getMessage());
else
handle_error("There was a problem removing the {$this->subject}.", $e->getMessage());
}
}
} else {
try {
$data->execute();
}
catch (PDOException $e) {
handle_error(/*public error msg - could set this anyway you want*/, $e->getMessage());
}
}
// Send success msg
}
关于php - 将数据库类与 PDO 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549377/