以下是一个通用的 PDO 类的示例代码,封装了一些常见的数据库操作功能,例如连接数据库、执行 SQL 语句、预处理、事务管理和返回异常等。建议在实际使用时根据具体情况进行适当修改和优化。

<?php

class DB {

    /** @var PDO $pdo PDO链接对象 */
    private $pdo;

    /** @var PDOStatement $statement 执行的语句对象 */
    private $statement;

    /**
     * 构造函数,连接数据库
     * 
     * @param string $host     数据库主机名
     * @param string $dbname   数据库名
     * @param string $user     数据库用户名
     * @param string $password 数据库密码
     */
    public function __construct(string $host, string $dbname, string $user, string $password) {
        $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";

        try {
            $this->pdo = new PDO($dsn, $user, $password);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            throw new PDOException("Database connection failed: " . $e->getMessage());
        }
    }

    /**
     * 执行 SQL 语句
     * 
     * @param string $sql      SQL查询语句
     * @param array  $bindings 查询语句绑定参数的数组
     * 
     * @return mixed 执行结果
     */
    public function query(string $sql, array $bindings = []) {
        try {
            $this->statement = $this->pdo->prepare($sql);
            $this->bindValues($bindings);
            return $this->statement->execute();
        } catch (PDOException $e) {
            throw new PDOException("Query execution failed: " . $e->getMessage());
        }
    }

    /**
     * 获取所有结果集
     * 
     * @return array 所有结果集
     */
    public function fetchAll() {
        return $this->statement->fetchAll();
    }

    /**
     * 获取单行结果集
     * 
     * @return array 单行结果集
     */
    public function fetch() {
        return $this->statement->fetch();
    }

    /**
     * 获取查询结果中某个字段的值
     *
     * @param string $columnName 待获取字段的名称
     *
     * @return mixed 字段值
     */
    public function fetchColumn(string $columnName) {
        return $this->statement->fetchColumn($columnName);
    }

    /**
     * 绑定参数
     * 
     * @param array $bindings 需要绑定的参数数组
     * 
     * @return void
     */
    public function bindValues(array $bindings) {
        foreach($bindings as $key => $value) {
            $this->statement->bindValue(is_int($key) ? $key + 1 : $key, $value);
        }
    }

    /**
     * 开启一个新的事务
     * 
     * @return bool 是否成功开启事务
     */
    public function beginTransaction() {
        return $this->pdo->beginTransaction();
    }

    /**
     * 提交事务
     * 
     * @return bool 是否成功提交事务
     */
    public function commit() {
        return $this->pdo->commit();
    }

    /**
     * 回滚事务
     * 
     * @return bool 是否成功回滚事务
     */
    public function rollBack() {
        return $this->pdo->rollBack();
    }

    /**
     * 获取最后插入的 ID
     * 
     * @return int 最后插入的 ID
     */
    public function lastInsertId(): int {
        return (int) $this->pdo->lastInsertId();
    }

    /**
     * 返回任何异常信息
     * 
     * @return bool|array 此方法将返回异常信息的数组,否则返回false
     */
    public function errorInfo() {
        return $this->pdo->errorInfo();
    }

    /**
     * 断开数据库连接
     * 
     * @return void
     */
    public function __destruct() {
        $this->pdo = null;
    }

}
?>

使用示例:

<?php
// 实例化 PDO 类
$db = new DB("localhost", "mydatabase", "root", "");

// 执行查询 SQL 语句并获得结果集
$db->query("SELECT * FROM `users` WHERE `id` = :id", [":id" => 1]);
$results = $db->fetchAll();

// 执行更新 SQL 语句(事务)
try {
    $db->beginTransaction();
    $db->query("UPDATE `users` SET `name` = :name WHERE `id` = :id", [":name" => "Jack", ":id" => 1]);
    $db->query("UPDATE `users` SET `email` = :email WHERE `id` = :id", [":email" => "jack@example.com", ":id" => 1]);
    $db->commit();
} catch(PDOException $e) {
    $db->rollBack();
    echo "Transaction failed: " . $e->getMessage();
}
?>
文章目录