2

ユーザーが製品コードを入力すると結果が返される製品検索エンジンを作りたいのですが、これは簡単です。

しかし、文字のように見える数字とその逆を補正できるようにしたいと考えています。

たとえば、ユーザーは 6O12l と入力しますが、製品コードは実際には 60121 です。

6O12l および/または 60121 を持つすべての製品を元に戻すには、SQL クエリに何を入力する必要がありますか?


これまでのところ、これは機能していません。何を入力しても、毎回同じ結果が返され続けます。

$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]l]BC の代わりに A[1l]BC のマングルされた出力が得られます

4

5 に答える 5

1

データベースを正規表現で効率的に検索することはできません。ただし、正規化された形式で保存するためにデータを変換し、正規化されたクエリ文字列 (すべてOを 0 に、 を 1 にIなど) を使用して検索することができますl

于 2012-07-01T14:46:32.983 に答える
1

これを使って:

SELECT * from products
where code REGEXP '6[O0]12[1l]'
于 2012-07-01T14:42:13.397 に答える
1

文字入りの商品コードはありますか?クエリを実行する前に、クエリ文字列をすべての数値に変換できます。これが最も簡単で、両方をテストするよりもはるかに高速です。

于 2012-07-01T14:43:02.233 に答える
0

私はそれを解決しました:D

参考までに、PHP.netでこの関数を見つけました。

function search_replace($s,$r,$sql)
{ $e = '/('.implode('|',array_map('preg_quote', $s)).')/';
$r = array_combine($s,$r);
return preg_replace_callback($e, function($v) use ($s,$r) { return $r[$v[1]]; },$sql);
} 
于 2012-07-01T16:05:13.147 に答える