impeck/safemysql

为安全高效处理MySQL查询而设计的PHP类

v1.2.0 2023-08-24 07:36 UTC

This package is auto-updated.

Last update: 2024-09-25 12:42:18 UTC


README

英文 | 俄语

SafeMySQL 是一个用于安全高效处理MySQL查询的PHP类。

colshrapnel/safemysql 分支出来的。

它具有几个关键特性

  • 安全性:所有动态查询部分都使用占位符内嵌到查询中,增强了安全性。
  • 便利性:它简化了应用程序代码,减少了冗余,并遵循DRY(不要重复自己)原则。

特性

SafeMySQL 提供了三个主要特性,使其区别于标准库

  1. 类型提示占位符:与传统库不同,SafeMySQL 为所有查询元素使用类型提示占位符。
  2. 简化使用:它通过一系列辅助方法消除了重复绑定和获取数据的需求。
  3. 部分占位符解析:SafeMySQL 允许在查询的任何部分进行占位符解析,通过 parse() 方法使复杂查询变得像标准查询一样简单。

入门

使用 SafeMySQL 非常简单。以下是关键步骤

  1. 始终在查询中使用占位符表示动态数据。
  2. 为每个占位符指定数据类型,包括
    • ?s ("字符串"): 用于字符串(包括 DATEFLOATDECIMAL)。
    • ?i ("整数"): 用于整数。
    • ?n ("名称"): 用于标识符(表和字段名称)。
    • ?a ("数组"): 用于与 IN 操作符一起使用的复杂占位符(以 'a,'b,'c' 格式替换,不带括号)。
    • ?u ("更新"): 用于与 SET 操作符一起使用的复杂占位符(以 field='value',field='value' 格式替换)。
    • ?p ("解析"): 用于插入预解析语句的特殊占位符类型,无需进一步处理,以避免双重解析。
  3. 利用辅助方法从查询中检索数据,包括
    • 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, ...): 返回一维数组(索引列),由键 => 值对组成。
  4. 对于复杂情况,请依赖于 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 操作符的数组以及用于 INSERTUPDATE 查询的数组。不再需要手动绑定字段名称或构建复杂查询。

例如,轻松绑定字段名称

$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);

同样的便利性也适用于复杂的 INSERTUPDATE 查询。

SafeMySQL 还提供了一套辅助函数,使日常数据库调用快速而直接。