-1

助けてください...データベース内の正確な単語を検索できるようにする必要があります..、すでに別の方法を使用しています..

方法 1

$param2 = "SELECT * from item WHERE prodname REGEXP '[[:<:]]($param)[[:>:]]'
           order by CASE WHEN instr(prodname, '$param') = 0 then 1 else 0 end,         
           instr(prodname, '$param') ASC";`

\これは非常にうまく機能していますが、 orで単語を検索しようと"するとエラーが返されます。私はすでに使用htmlspecialcharsしてmysql_real_escape_stringいますが、問題はまだ存在します..

方法 2

$param2 = "WHERE prodname LIKE '$param %' OR prodname LIKE '% $param'
           OR prodname LIKE ' $param%' OR prodname LIKE '%$param '
           OR prodname LIKE '% $param %'
           order by CASE WHEN instr(prodname, '$param') = 0 then 1 else 0 end, instr(prodname, '$param') ASC";`

これもうまく機能していますが、「STAMP PAD INK (RED)」などの正確な製品を入力すると、「NOT FOUND」という結果が返されますが、「STAMP PAD INK」のみを入力すると表示されます。追加'%$param%'しますが、正確な単語を入力すると ex. 「インク」「しわ」という言葉も表示されますが、それは望ましくありません。

全文使えない…

4

2 に答える 2

0

方法 2 の場合: 正確な積を取得するには、次を使用します: LIKE '$param'

% 文字は任意の数の文字と一致しますが、ゼロ文字でも一致しますが、たとえば、'% $param %' にはまだスペース文字があります。

詳細: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html#operator_like

于 2013-07-23T05:23:27.583 に答える
0

次のように $param に PHP 関数の addslashes() を使用してみてください。

$param = addslashes($param);

これにより、方法1が機能します。

mysql_real_escape_string の動作はデフォルトの文字セットに基づいており、どの文字セットを使用しているかわかりません。それはあなたのために働いていないので、addslashes はおそらくそうするでしょう。

ところで、データベースが大きくなるにつれて REGEXP は非常に遅くなる可能性があるため、フルテキスト インデックス作成の使用方法をさらに検討することをお勧めします。そして、あなたが示す方法2は、常に非常にゆっくりと実行されます。

于 2013-07-23T05:29:48.417 に答える