impeck / safemysql
为安全高效处理MySQL查询而设计的PHP类
v1.2.0
2023-08-24 07:36 UTC
Requires
- php: ^7.4 || ^8.0
Requires (Dev)
- phpunit/phpunit: ^10.3
This package is auto-updated.
Last update: 2024-09-25 12:42:18 UTC
README
英文 | 俄语
SafeMySQL 是一个用于安全高效处理MySQL查询的PHP类。
从 colshrapnel/safemysql 分支出来的。
它具有几个关键特性
- 安全性:所有动态查询部分都使用占位符内嵌到查询中,增强了安全性。
- 便利性:它简化了应用程序代码,减少了冗余,并遵循DRY(不要重复自己)原则。
特性
SafeMySQL 提供了三个主要特性,使其区别于标准库
- 类型提示占位符:与传统库不同,SafeMySQL 为所有查询元素使用类型提示占位符。
- 简化使用:它通过一系列辅助方法消除了重复绑定和获取数据的需求。
- 部分占位符解析:SafeMySQL 允许在查询的任何部分进行占位符解析,通过 parse() 方法使复杂查询变得像标准查询一样简单。
入门
使用 SafeMySQL 非常简单。以下是关键步骤
- 始终在查询中使用占位符表示动态数据。
- 为每个占位符指定数据类型,包括
- ?s ("字符串"): 用于字符串(包括
DATE
、FLOAT
和DECIMAL
)。 - ?i ("整数"): 用于整数。
- ?n ("名称"): 用于标识符(表和字段名称)。
- ?a ("数组"): 用于与
IN
操作符一起使用的复杂占位符(以 'a,'b,'c' 格式替换,不带括号)。 - ?u ("更新"): 用于与
SET
操作符一起使用的复杂占位符(以field
='value',field
='value' 格式替换)。 - ?p ("解析"): 用于插入预解析语句的特殊占位符类型,无需进一步处理,以避免双重解析。
- ?s ("字符串"): 用于字符串(包括
- 利用辅助方法从查询中检索数据,包括
query($query, $param1, $param2, ...)
: 返回 mysqli 资源。getOne($query, $param1, $param2, ...)
: 返回标量值。getRow($query, $param1, $param2, ...)
: 返回一维数组(一行)。getCol($query, $param1, $param2, ...)
: 返回一维数组(一列)。getAll($query, $param1, $param2, ...)
: 返回二维数组(行数组)。getInd($key, $query, $par1, $par2, ...)
: 返回索引二维数组(行数组)。getIndCol($key, $query, $par1, $par2, ...)
: 返回一维数组(索引列),由键 => 值对组成。
- 对于复杂情况,请依赖于 parse() 方法。
示例用法
以下是一些使用 SafeMySQL 的示例
$name = $db->getOne('SELECT name FROM table WHERE id = ?i', $_GET['id']); $data = $db->getInd('id', 'SELECT * FROM ?n WHERE id IN (?a)', 'table', [1, 2]); $data = $db->getAll("SELECT * FROM ?n WHERE mod=?s LIMIT ?i", $table, $mod, $limit);
SafeMySQL 的突出特点是它的类型提示占位符。这种方法不仅适用于简单的标量数据,还允许您包括标识符、用于 IN
操作符的数组以及用于 INSERT
和 UPDATE
查询的数组。不再需要手动绑定字段名称或构建复杂查询。
例如,轻松绑定字段名称
$field = $_POST['field']; $value = $_POST['value']; $sql = "SELECT * FROM table WHERE ?n LIKE ?s"; $data = $db->query($sql, $field, "%$value%");
简化涉及 IN
操作符数组的查询
$array = [1, 2, 3]; $data = $db->query("SELECT * FROM table WHERE id IN (?a)", $array);
同样的便利性也适用于复杂的 INSERT
和 UPDATE
查询。
SafeMySQL 还提供了一套辅助函数,使日常数据库调用快速而直接。