我正在BOOLEAN模式下用PHP进行全文搜索,这种方式有95%的时间在工作。但是,当我输入“”这样的特殊字符时,查询将失败。
有问题的表包含约6,000条记录,其中大量是商业级紧固件。
示例数据:
7/16“ UNF x 2 1/4” Hex
在执行查询之前,使用以下函数清除输入
function clean($db, $str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
$str = htmlspecialchars($str, ENT_NOQUOTES);
$str = preg_replace("/[[:blank:]]+/"," ",$str);
return mysqli_real_escape_string($db, $str);
}
搜索7/16“时,应该什么也没有,我什么也没得到,我相信这与错误地对输入进行转义有关。
清除输入后,我会在每个单词的开头加上+,以确保其包含在结果中。这可以通过以下操作完成:
$symbol = '+';
$string = $symbol . str_replace(' ', " $symbol", $term);
示例查询:
SELECT * FROM products WHERE MATCH (code, desc) AGAINST ('+7\/16\\\"' IN BOOLEAN MODE) ORDER BY desc ASC
您会看到7/16“的原始输入已更改为+7/16 \\”。我怀疑这是问题所在。
我真的不确定clean函数的哪一部分导致了此问题,我认为通过将ENT_NOQUOTES添加到htmlspecialchars可以解决它,但是还没有解决。