1

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

我发现了这个

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

我需要将它与不受信任的文本一起使用,所以我使用参数化查询。

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

4

2 回答 2

1

我认为

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!
于 2013-08-28T23:46:15.973 回答
0

如果您希望百分号成为字符串参数的一部分,请用方括号将其括起来。在将参数发送到数据库之前,对应用程序代码执行此操作。

于 2013-08-29T00:53:03.537 回答