2013-08-28 25 views
1

我使用PDO和SQLite,並希望實現unicode字符串不區分大小寫的匹配。如何使用`sqliteCreateFunction`自定義的LIKE語句在參數化查詢中轉義通配符?

我發現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); 

我需要與不受信任的文本中使用它,所以我使用參數化查詢。

問題是不可信的文本可以包含像%_通配符,我不希望他們的行爲與通配符

回答

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! 
0

如果你想百分號爲字符串參數的一部分,圍繞着它用方括號。在將參數發送到數據庫之前,使用您的應用程序代碼執行此操作。

相關問題