写在前面

很多年前,还在学校的时候,我就写过一个自己的mysql连接库,当时没有用到mysqli,基本是面向对象的一个版本,很多判断很多写法都很稚嫩,大概几百行吧

挖坟代码

后来,我实际工作大概一两年的时候,在北京的出租屋里,我重新写了一次mysql连接库,精简了很多,一百来行

算是一个很难忘的记忆吧

这次写的,是一个纯静态调用的php类库

很粗糙,也没有当年那么多的判断和检测

纯粹只是情怀而写

代码

调用示例

代码里没有什么很特别的东西,也只是心血来潮

  1. 外部通过setConfig方法可以注入配置的数组,直接写入到类的属性里
  2. 所有的方法调用都是纯静态的,不需要实例化
  3. setConfig方法里返回了类的所在位置,可以后续链式调用
  4. row方法和rows方法都支持传入匿名函数,可以在刚把数据取出来的时候直接处理数据,减少循环次数
<?php

/**
 * Db操作:2025/06/10
 *
 * 具体用法:
 *
 * 配置内容
 * Db::setConfig([
 *     'dbHost' => '127.0.0.1',
 *     'dbUser' => 'root',
 *     'dbPass' => 'root',
 *     'dbName' => 'test',
 *     'dbCharset' => 'utf8mb4',
 * ]);
 *
 * 连接
 * Db::enable();
 *
 * 执行单条sql
 * $result = Db::query("UPDATE user SET a=1,b=2 WHERE 1");
 *
 * 获取单条数据,并在其内修改
 * $row = Db::row("SELECT * FROM `user` LIMIT", function($row) {
 *      $row['test'] = 1;
 *      return $row;
 * });
 *
 * 获取多条数据,并在其内修改
 * $row = Db::rows("SELECT * FROM `user` LIMIT 2", function($row) {
 *      $row['test'] = 1;
 *      return $row;
 * });
 */
class Db
{
    private static $dbHost = '127.0.0.1';
    private static $dbUser = 'root';
    private static $dbPass = 'root';
    private static $dbName = '';
    private static $dbCharset = 'utf8mb4';
    private static $db;

    public static function query($sql)
    {
        return self::$db->query($sql);
    }

    public static function rows($sql, $callback = null)
    {
        $result = self::$db->query($sql);
        if ($result->num_rows == 0) return [];

        while ($row = $result->fetch_assoc()) {
            if ($callback) $row = $callback($row);

            $rows[] = $row;
        }
        return $rows;
    }

    public static function row($sql, $callback = null)
    {
        $result = self::$db->query($sql);
        if ($result->num_rows == 0) return [];

        $row = $result->fetch_assoc();
        if ($callback) $row = $callback($row);

        return $row;
    }

    // 注入配置
    public static function setConfig($userConfig = [])
    {
        if (empty($userConfig)) return __CLASS__;

        $dbConfigNames = ['dbHost', 'dbUser', 'dbPass', 'dbName', 'dbCharset'];
        foreach ($dbConfigNames as $dbConfigName) {
            if (!empty($userConfig[$dbConfigName])) self::$$dbConfigName = $userConfig[$dbConfigName];
        }

        return __CLASS__;
    }

    // 启用DB
    public static function enable()
    {
        // 连接
        self::$db = new mysqli(self::$dbHost, self::$dbUser, self::$dbPass, self::$dbName);

        if (self::$db->connect_error) {
            die("数据库连接失败: " . self::$db->connect_error);
        }

        if (self::$dbCharset) self::$db->set_charset(self::$dbCharset);
    }

    // 销毁Db
    public static function disable()
    {
        self::$db->close();
    }
}
最后修改:2025 年 07 月 11 日
如果您对各种技术博客文章感兴趣,欢迎关注拓行公众号,分享各种专业技术知识~