josemmo/umysql

简单的MySQL抽象层

v0.0.1 2022-07-05 13:38 UTC

This package is auto-updated.

Last update: 2024-09-08 18:56:24 UTC


README

Build Status Latest Version Minimum PHP Version License

UMySQL 是一个极其简单的 PHP 库,用于轻松地与 MySQL 数据库通信,同时将开销降至最低。它旨在成为一个几乎 1:1 的现代替代品,用于 SafeMySQL

它不提供任何 ORM、迁移、事件、缓存等功能:只提供启动所需的最小功能。

安装

首先,请确保您的环境满足以下要求

然后,您应该可以使用 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