我有一个包含不同项目(3个列)的信息的数据库。 " itemname"的值列(正在搜索的列)包含特殊字符,这使得用户很难找到他们要查找的内容。
格式:"刺刀/大理石褪色(崭新出厂)"
现在用户必须输入确切的结构,包括" /"和"("和")"。我想要忽略这些角色,以便" Bayonet Marble"将产生与" Bayonet / Marble"相同的结果。
我的(工作)查询:
"SELECT itemname, itemprice, itemupdate FROM pricedata WHERE itemname LIKE '%" . $search . "%' ORDER BY itemprice DESC LIMIT 20");
我发现忽略/的非工作解决方案。
"SELECT itemname, itemprice, itemupdate FROM pricedata WHERE replace(itemname, ' / ', ' ') LIKE '%" . $search . "%' ORDER BY itemprice DESC LIMIT 20");
值不应永久更改。仅用于查询。
这样做的正确方法是什么?我做错了什么?
非常感谢! :)
答案 0 :(得分:0)
我提倡在你进行查询之前做一些艰苦的工作。 PHP具有使用字符串的出色功能。在这种情况下,您可以删除任何您不想要的字符,然后将字符串拆分为空格,最后根据单个单词构建查询:
$user_query = 'word1 (word2 word3';
//remove any stray characters you don't want
$remove = array('/', '\\', '(', ')');
$cleaned = str_replace($remove, "", $user_query);
//breaks string at spaces
$words = explode(" ", $cleaned);
print_r($words);
//finally, build the query
$query = "SELECT itemname, itemprice, itemupdate FROM pricedata WHERE ";
$count = count($words);
for($i = 0; $i < $count; $i++){
if(strlen($words[$i]) > 0){
$query .= 'itemname LIKE %' . $words[$i] . '% ';
if($i < ($count - 1)){
$query .= 'OR '; //could also be AND
}
}
}
$query .= "ORDER BY itemprice DESC LIMIT 20";
答案 1 :(得分:0)
用空格替换斜杠后,现在两个单词之间留有3个空格。在“喜欢”匹配中,空格也必须匹配。
尝试替换所有空白区域在搜索字段中,并使用空字符串搜索字符串。或者具有单个空格的多个连续空白区域。