关于我的脚本和搜索,我有两个问题。我有这个脚本:
$searchTerms = explode(' ', $varSearch);
$searchTermBits = array();
foreach($searchTerms as $term){
$term = trim($term);
if(!empty($term)){
$searchTermBits[] = "column1 LIKE '%".$term."%'";
}
}
$sql = mysql_query("SELECT * FROM table WHERE ".implode(' OR ', $searchTermBits)."");
我有一个数据名称为“rock cheer climbing here”的column1
如果我输入“攀岩”,此数据显示。这完美,但如果我只是键入“岩石”,它没有显示。那是为什么?
另外,如何为要搜索的关键字添加另一个“column2”?
谢谢!
答案 0 :(得分:1)
搜索该字符串中的“rocks”不起作用,因为数据中不存在字符串“rocks”。看着它,对你来说很有意义,因为你知道“摇滚”的复数是“岩石”,但数据库并不知道。
您可以尝试的一个选项是从搜索字词中删除S,但是您遇到了其他问题 - 例如,“berry”的复数是“浆果”,如果删除S,您将成为寻找“berrie”,这对你没有任何帮助。
您可以添加更多行,例如
,以添加更多搜索字词$searchTermBits[] = "column1 LIKE '%".$term."%'";
并将".$term."
替换为您要搜索的内容。例如,
$searchTermBits[] = "column1 LIKE '%climb%'";
还有一点需要注意......编写后,您的代码很容易受到SQL注入的影响。以此为例...如果网站访问者在搜索字词'; DROP TABLE tablename;
中输入内容,那么您的数据已被清除。
您应该做的是将searchTermBits[]
行修改为:
$searchTermBits[] = "column1 LIKE '%" . mysql_real_escape_string($term) . "%'";
这可以防止任何恶意伤害您的数据。
答案 1 :(得分:0)
您的第1列数据rock cheer climbing here
您的搜索条件%Rocks%
完全不适合rocks
不在您的column1数据中
您可以像对column1一样添加column2,然后使用AND运算符(column1 LIKE "%rock%" OR column1 LIKE "%climb%") AND (column2 LIKE "%rope%" OR column2 LIKE "%powder%")
TIPS: 如果你的表/模式使用xx_xx_ci collation(那么这是不区分大小写的,mysql不关心区分大小写)但是如果是other,那么你需要确保搜索项必须区分大小写(mysql做区分大小写)。 / p>
答案 2 :(得分:0)
假设您提供的数据准确,则不应该匹配,因为您使用的是“Rocks”,字符串中的单词是“rock”。默认情况下,mysql不会进行区分大小写的匹配,因此情况可能并非如此。
另外,为避免sql注入,你绝对应该使用mysql_real_escape_string来逃避你的内容。
添加第二列也很容易。只需为每个搜索项为数组添加两个条目,一个用于column1,另一个用于column2。