php - 如何使用使用 `sqliteCreateFunction` 自定义的 LIKE 语句来转义参数化查询中的通配符?

标签 php sql sqlite pdo escaping

我将 PDO 与 SQLite 结合使用,并希望对 unicode 字符串实现不区分大小写的匹配。

我找到了this :

function lexa_ci_utf8_like($mask, $value) {
    $mask = str_replace(
        array("%", "_"),
        array(".*?", "."),
        preg_quote($mask, "/")
    );
    $mask = "/^$mask$/ui";
    return preg_match($mask, $value);
}

$pdo->sqliteCreateFunction('like', "lexa_ci_utf8_like", 2);

我需要将其与不受信任的文本一起使用,因此我使用参数化查询。

问题是不受信任的文本可能包含 %_ 等通配符,我不希望它们表现为通配符

最佳答案

我认为

function lexa_ci_utf8_like($mask, $value) {
    return preg_match('/^' . preg_quote($mask, '/') . '$/ui', $value);
}
$pdo->sqliteCreateFunction('like', "lexa_ci_utf8_like", 2);

就可以解决这个问题,因为 SQL 通配符 %_ 不是正则表达式通配符,并且 preg_quote 会转义正则表达式字符不受信任的文本。

测试用例

SELECT 'à' like 'À'     // 1   Just testing if utf8 works
SELECT 'aa' like '%a';  // 0   `%` not used as wildcard!
SELECT 'aa' like '_a';  // 0   `_` not used as wildcard!

关于php - 如何使用使用 `sqliteCreateFunction` 自定义的 LIKE 语句来转义参数化查询中的通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18499943/

相关文章:

sql - Access VBA 中的 UNION 查询

Laravel SQLite 字段的默认值

PHP:preg_replace 吃掉所有内存

PHP 处理 JSON 发送的数据

sql - 允许从 Perl 查询 MySQL 数据库的友好模块是什么?

mysql 列出不包括周末的数据

android - 对Android中SQLite数据库初始化的困惑

node.js - 构建支持分面和分页的搜索 API

php - 使用 yql 和 php 抓取内容

php - 将php编写的chrome扩展转换为IE