我想製作一個產品搜索引擎,用戶輸入產品代碼並將結果返回,這很容易。使用正則表達式替換搜索MySQL數據庫
但是,我希望能夠補償看起來像字母的數字,反之亦然。
E.g用戶類型6O12l,但產品代碼實際上是60121.
我需要什麼就擺在SQL查詢帶回與6O12l和/或60121的所有產品?
到目前爲止,我有這裏面不工作,它一直帶回相同的結果,每次不管我輸入:
$searchString = $_POST['query'] ;
$searchString = preg_replace('#\W#', '', $searchString);
$firstLetter = substr($searchString, 0, 1) ;
include("db.php") ;
$result = $dbh->prepare("SELECT productCode
FROM products
WHERE productCodeREGEXP '6[O0]12[1l]'
AND productCode LIKE '$firstLetter%'") ;
$result->execute() ;
while($row = $result->fetch(PDO::FETCH_ASSOC)) {
echo $row['productCode'].'<br />' ;
}
我設法得到它的工作,但我遇到了一個新問題。
我使用str_replace函數來取代在用戶的查詢串號,反之亦然字母,但它僅適用於一個或另一個,而不是兩個工作:
$qString = str_replace(array('o', 'l', '0', '1'), array('[O0]', '[1l]', '[O0]', '[1l]'), $searchString) ;
,給了我一個錯位輸出例如A [[線1l] 1] BC 而不是[線1l] BC
嗨,產品代碼可以有字母和數字的混合(和符號像 - 但沒關係)。 – imperium2335
@ juergen_d的回答是明智的。你可以通過執行'WHERE code LIKE'6%'和代碼REGEXP'6 [o0] 12 [1l]''來加速它。這樣,可以在字母/數字組合前的前綴上使用索引。否則,它會每次在所有6M行上運行正則表達式。 –
+1首字母的想法,這對我來說加快了很多 – imperium2335