josemmo / umysql
简单的MySQL抽象层
v0.0.1
2022-07-05 13:38 UTC
Requires
- php: >=7.1
- ext-mysqli: *
Requires (Dev)
- jetbrains/phpstorm-stubs: ^2022.1
- psalm/plugin-phpunit: ^0.17.0
- symfony/phpunit-bridge: *
- vimeo/psalm: ^4.24
README
UMySQL 是一个极其简单的 PHP 库,用于轻松地与 MySQL 数据库通信,同时将开销降至最低。它旨在成为一个几乎 1:1 的现代替代品,用于 SafeMySQL。
它不提供任何 ORM、迁移、事件、缓存等功能:只提供启动所需的最小功能。
安装
首先,请确保您的环境满足以下要求
- PHP 7.1 或更高版本
- MySQLi 扩展
然后,您应该可以使用 Composer 安装此库
composer require josemmo/umysql
使用方法
创建新实例
通常,您会希望使用连接选项创建一个新的数据库实例
$db = new UMySQL([ 'hostname' => '127.0.0.1', // Defaults to "localhost" 'username' => 'app', // Defaults to "root" 'password' => 'S3cret', // Defaults to "" (empty string) 'database' => 'blog', // Defaults to none selected 'port' => 3306, // Defaults to 3306 'charset' => 'utf8mb4' // Defaults to "utf8mb4" ]);
您还可以连接到 UNIX 套接字
$db = new UMySQL([ 'socket' => '/run/mysqld/mysqld.sock', 'username' => 'root', 'password' => 'toor', ]);
作为选项的替代,您可以将一个 mysqli
实例包装在数据库连接周围
$db = new UMySQL(mysqli_connect('localhost', 'root', '', 'blog'));
编写查询
UMySQL 支持各种占位符,用于安全地将值替换到查询中
?s
用于字符串、十进制和日期?i
用于整数?n
用于标识符(表和列名称)?a
用于字符串数组?u
用于映射(关联数组),在 UPDATE 查询中很有用?p
用于已解析的查询部分
以下是一些如何使用它们的常见示例
$db->parse('SELECT * FROM movies'); // SELECT * FROM movies $db->parse('SELECT * FROM ?n WHERE username=?s AND points>=?i', 'users', 'nick', 100); // SELECT * FROM `users` WHERE username='nick' AND points>=100 $db->parse('SELECT * FROM products WHERE id IN (?a)', [10, null, 30]); // SELECT * FROM products WHERE id IN ('10', NULL, '30') $db->parse('INSERT INTO metrics SET ?u', ['rtt' => 132.22, 'unit' => 'ms']); // INSERT INTO metrics SET `rtt`='132.22', `unit`='ms' $db->parse('SELECT * FROM places WHERE city=?s ORDER BY ?n ?p', 'London', 'name', 'ASC'); // SELECT * FROM places WHERE city='London' ORDER BY `name` ASC
获取结果
数据库实例内置了内置助手,可以以简单的方式从数据库中检索行
$db->getAll()
用于获取结果集中的所有行$db->getRow()
用于获取第一行或null
(如果结果集为空)$db->getCol()
用于获取结果集中的第一列的值$db->getOne()
用于获取第一行中的第一列或false
(如果结果集为空)
以下是一些示例
$movies = $db->getAll('SELECT title, year FROM movies'); // [['title' => '...', 'year' => '...'], ['title' => '...', 'year' => '...'], ...] $product = $db->getRow('SELECT * FROM products WHERE id=?i', 123); // ['name' => '...', 'price' => '...'] $metrics = $db->getCol('SELECT rtt FROM metrics WHERE created_at>=?s', gmdate('Y-m-d 00:00:00')); // ['112.12', '128.93', '120.66', '119.34', ...] $userId = $db->getOne('SELECT id FROM users WHERE username=?s', 'some-username'); // '123'
执行其他查询
对于非 SELECT 和更复杂的查询,UMySQL 有一个 $db->query()
方法,它返回一个自定义的 Result
实例。
通常,您会在不关心操作结果或没有结果集的情况下使用此方法
$db->query('TRUNCATE metrics'); // [\UMySQL\Result]
Result 实例在 UPDATE/DELETE 操作中也非常有用,可以获取受影响的行数
$affectedRows = $db->query('DELETE FROM users WHERE banned=1')->rowCount(); // '123'
类似地,您可以在 INSERT 操作中获取自增列的最后一个插入 ID
$productId = $db->query('INSERT INTO products (name, price) VALUES (?s, ?s)', 'Something', 12.34)->insertId(); // '321'
这些实例也可以用于以自己的速度读取结果集
$result = $db->query('SELECT * FROM large_table'); while ($row = $result->fetchRow()) { // Do something with `$row` } $result->free(); // Optional, will get called after `unset($result)`
运行测试套件
如果您想为此项目做出贡献,请在提交新更改之前运行测试。
测试是在 MySQL 数据库上运行的,因此您需要事先定义以下环境变量
DB_HOSTNAME
DB_USERNAME
DB_PASSWORD
(可选)DB_DATABASE