zheltikov / php-queryf
1.0.0
2022-02-28 18:47 UTC
Requires
- php: >=8.1
- ext-mysqli: *
- zheltikov/php-invariant: ^1.0
Requires (Dev)
This package is auto-updated.
Last update: 2024-08-29 00:48:04 UTC
README
此类代表对MySQL数据库执行查询。
直接编码SQL值是错误的。库将尝试防止此类操作。where子句、插入等所有值都应通过以下编码方法进行参数化。这将使您的代码更加健壮和可靠,同时避免常见的安全问题。
使用很简单;使用特殊的printf-like标记构建查询,提供替换参数,然后将它们传递给数据库库。或者,您可以调用render*()方法之一,查看将要运行的SQL。
示例
use Zheltikov\Queryf\Query;
use Zheltikov\Queryf\QueryArgument;
use Zheltikov\Queryf\QueryArgumentType as Type;
$q = new Query(
'SELECT foo, bar FROM Table WHERE id = %d',
[
QueryArgument::fromDynamic(Type::Int, 17),
]
);
echo 'query: ' . $q->renderInsecure();
use Zheltikov\Queryf\Pair;
use Zheltikov\Queryf\Query;
use Zheltikov\Queryf\QueryArgument;
use Zheltikov\Queryf\QueryArgumentType as Type;
use Zheltikov\Queryf\_List;
$condition = QueryArgument::fromDynamic(Type::PairList);
$condition->getPairs()
->append(new Pair('id1', QueryArgument::newInt(7)))
->append(new Pair('id2', QueryArgument::newInt(14)));
$q = new Query(
'SELECT %LC FROM %T WHERE %W',
[
QueryArgument::fromDynamic(
Type::List,
new _List(
QueryArgument::newString('id1_type'),
QueryArgument::newString('data'),
),
),
QueryArgument::newString('assoc_info'),
$condition,
]
);
查询中的替换值应该是混合值。某些代码(如%W、%U等)期望的复合值也是包含数组或映射值的混合对象。
代码
%s、%d、%u、%f- 字符串、整数、无符号整数或浮点数;如果传入null,则为NULL。%m- 混合类型,转换为字符串/整数/浮点数/布尔值。null变为"NULL",否则抛出异常。%=s、%=d、%=u、%=f、%=m- 与之前类似,但适合比较,因此"%s"变为" = VALUE"。null变为"IS NULL"。%T- 表名。用``括起来。%C- 类似于%T,但对于列名。可选地提供两个/三个元组来定义限定列名或带有别名的限定列名。["table_name", "column_name"]将变为"`table_name`.`column_name`",而["table_name", "column_name", "alias"]将变为"`table_name`.`column_name` AS `alias`"。%V- VALUES样式行列表;期望一个列表的列表,每个列表长度相同。%Ls、%Ld、%Lu、%Lf、%Lm- 由逗号分隔的字符串/整数/无符号整数/浮点数。%LC- 由逗号分隔的列名列表。可选地作为两个/三个元组的列表提供,以定义限定列名或带有别名的限定列名。类似于%C。%LO、%LA- 以key1=val1 OR/AND key2=val2的形式呈现的键/值对(类似于%W)。%U、%W- 分别适用于UPDATE和WHERE子句的键和值。%U变为"`col1` = val1, `col2` = val2",而%W变为"`col1` = val1 AND `col2` = val2"。目前不支持无符号整数。%Q- 文字字符串,邪恶邪恶。不要使用。%K- SQL注释。将为您放置/*和*/。%%- 文字%字符。
有关更多详细信息,请参阅https://github.com/facebook/squangle。