php - 将数据库类与 PDO 一起使用

标签 php mysql pdo database-connection

关闭。这个问题是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/

相关文章:

sql - MySQL 表数据转换——如何分解 MySQL 时间数据?

mysql - 全文搜索未给出所需结果

PHP PDO : SQL query not returning expected result

php - PDOStatement执行SQLSTATE参数个数无效

php - 如何展平多维数组?

php - 根据 PHP 变量的值调用 JavaScript 函数

PHP Mysql 准备查询按照日期排序

php - 是否可以在服务器端运行 jQuery?

mysql - 用户验证值-存储在哪里

php - INSERT 不适用于 PDO 准备好的语句