写在前面
很多年前,还在学校的时候,我就写过一个自己的mysql
连接库,当时没有用到mysqli
,基本是面向对象的一个版本,很多判断很多写法都很稚嫩,大概几百行吧
后来,我实际工作大概一两年的时候,在北京的出租屋里,我重新写了一次mysql
连接库,精简了很多,一百来行
算是一个很难忘的记忆吧
这次写的,是一个纯静态调用的php
类库
很粗糙,也没有当年那么多的判断和检测
纯粹只是情怀而写
代码
代码里没有什么很特别的东西,也只是心血来潮
- 外部通过
setConfig
方法可以注入配置的数组,直接写入到类的属性里 - 所有的方法调用都是纯静态的,不需要实例化
setConfig
方法里返回了类的所在位置,可以后续链式调用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();
}
}