我将 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/