打造一套属于自己的php开发框架(一)封装Db类

本文介绍了作者为简化开发过程,针对ThinkPHP和Laravel框架中占用资源的问题,自己封装了一个轻量级的Db类,主要实现MySQL的增删改查功能,示例展示了如何在PHP中使用这个Db类进行数据库操作。
摘要由CSDN通过智能技术生成

一直使用thinkphp或者laravel框架,越到后面越发现,这些框架占用太大了,最主要的是很多东西完全用不到,我就想为啥不能自己封装一个?想到就搞,这个是一个Db类,主要封装了MySQL的增删改查方法,使用起来类似thinkphp和laravel。

多的不说了,直接上代码:

<?php

class Db
{
    protected static \PDO $connection; // 数据库连接
    protected static string $table; // 数据表名
    protected static array $wheres = []; // 查询条件
    protected static ?int $findId = null; // 查找的记录 ID
    protected static bool $initialized = false; // 数据库连接是否已初始化

    // 确保数据库连接已建立
    protected static function ensureConnection()
    {
        if (!self::$initialized) {
            self::$connection = new \PDO("mysql:host=localhost;dbname=数据库名称", "数据库用户名", "数据库密码");
            self::$initialized = true;
        }
    }

    // 设置数据表名
    public static function table(string $table): self
    {
        self::ensureConnection();
        self::$table = $table;
        return new self();
    }

    // 设置查询条件
    public static function where(string $column, string $operator, $value): self
    {
        self::$wheres[] = compact('column', 'operator', 'value');
        return new self();
    }

    // 根据 ID 查询记录
    public static function find(int $id): array
    {
        self::ensureConnection();
        $query = "SELECT * FROM " . self::$table . " WHERE id = :id";
        $statement = self::$connection->prepare($query);
        $statement->execute([':id' => $id]);
        return $statement->fetch(\PDO::FETCH_ASSOC);
    }

    // 查询符合条件的记录
    public static function get(): array
    {
        self::ensureConnection();
        $query = "SELECT * FROM " . self::$table;

        if (!empty(self::$wheres)) {
            $query .= " WHERE ";
            foreach (self::$wheres as $where) {
                $query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";
            }
            $query = rtrim($query, " AND ");
        }

        $statement = self::$connection->prepare($query);
        $statement->execute();
        return $statement->fetchAll(\PDO::FETCH_ASSOC);
    }

    // 分页查询
    public static function paginate(int $page = 1, int $perPage = 10): array
    {
        self::ensureConnection();
        $offset = ($page - 1) * $perPage;
        $query = "SELECT COUNT(*) as count FROM " . self::$table;

        if (!empty(self::$wheres)) {
            $query .= " WHERE ";
            foreach (self::$wheres as $where) {
                $query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";
            }
            $query = rtrim($query, " AND ");
        }

        $statement = self::$connection->prepare($query);
        $statement->execute();
        $totalResults = $statement->fetchColumn();

        $query = "SELECT * FROM " . self::$table;
        if (!empty(self::$wheres)) {
            $query .= " WHERE ";
            foreach (self::$wheres as $where) {
                $query .= "{$where['column']} {$where['operator']} '{$where['value']}' AND ";
            }
            $query = rtrim($query, " AND ");
        }
        $query .= " LIMIT $perPage OFFSET $offset";

        $statement = self::$connection->prepare($query);
        $statement->execute();
        $results = $statement->fetchAll(\PDO::FETCH_ASSOC);

        $totalPages = ceil($totalResults / $perPage);

        return [
            'data' => $results,
            'total' => $totalResults,
            'perPage' => $perPage,
            'currentPage' => $page,
            'totalPages' => $totalPages,
        ];
    }

    // 插入数据
    public static function insert(array $data): bool
    {
        self::ensureConnection();
        $columns = implode(', ', array_keys($data));
        $placeholders = implode(', ', array_fill(0, count($data), '?'));
        $values = array_values($data);

        $query = "INSERT INTO " . self::$table . " ($columns) VALUES ($placeholders)";
        $statement = self::$connection->prepare($query);
        return $statement->execute($values);
    }

    // 更新数据
    public static function update(array $data, int $id): bool
    {
        self::ensureConnection();
        $updates = [];
        foreach ($data as $column => $value) {
            $updates[] = "$column = ?";
        }
        $setClause = implode(', ', $updates);

        $query = "UPDATE " . self::$table . " SET $setClause WHERE id = ?";
        $values = array_values($data);
        $values[] = $id;

        $statement = self::$connection->prepare($query);
        return $statement->execute($values);
    }

    // 删除数据
    public static function delete(int $id): bool
    {
        self::ensureConnection();
        $query = "DELETE FROM " . self::$table . " WHERE id = ?";
        $statement = self::$connection->prepare($query);
        return $statement->execute([$id]);
    }
}

使用方法:

假设有一个名为 users 的数据表

1.插入一条数据

Db::table('users')->insert(['name' => 'John', 'age' => 30]);

2.查询 ID 为 1 的记录

$result = Db::table('users')->find(1);
var_dump($result); // 输出查询结果

3.更新 ID 为 1 的记录

Db::table('users')->update(['age' => 35], 1);

4.查询年龄大于 30 的用户,并分页显示

$users = Db::table('users')->where('age', '>', 30)->paginate(1, 10);
var_dump($users); // 输出分页结果

5.删除 ID 为 1 的记录

Db::table('users')->delete(1);

大概就是这样了,实现了简单的增删改查,如果不够的可以自己添加一些代码

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dogdev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值