我的问题是在搜索查询中使用了符号。我希望用户能够使用符号而不会出现问题,但是mysql中的LIKE函数似乎不是解决方案所以我需要一些帮助。
示例:如果有人在数据库中搜索“Blue's car”和“Blues car”,则此查询将返回0结果。或者viseversa,如果有人在数据库中搜索“Blues car”和“Blue's car”,则此查询也将返回0结果。
这是我目前正在使用的一个例子:
("SELECT Title FROM MyData WHERE Title LIKE '%".$search."%'")
还有其他方法可以提供更好的搜索结果吗?
感谢。
答案 0 :(得分:4)
搜索字段
您可以有一个额外的“搜索”字段,用于存储没有标点符号的标题,当用户输入搜索字符串时,在应用查询之前删除标点符号。你也可以删除主要的“The”。
我将进一步解释上述内容。
在数据库中,您有这样的记录。 SearchTitle是标题,删除了前导“The”和标点符号:
Title SearchTitle
------------------------------------------
The Blue's Clues Blues Clues
此处,用户知道确切的标题并输入以下搜索字符串:
The Blue's Clues
你删除了领先的“The”和标点符号,产生以下内容:
Blues Clues
您的查询如下所示
SELECT Title FROM MyData WHERE SearchTitle LIKE '%Blues Clues%'
此处,用户不知道确切的标题并输入以下内容:
Blues Clues
剥离前导“The”和标点符号仍然会产生同样的结果:
Blues Clues
您的查询保持不变,并与搜索字段中的内容相匹配:
SELECT Title FROM MyData WHERE SearchTitle LIKE '%Blues Clues%'
这可以进一步改进。关键是将相同的规则应用于搜索字符串,以及搜索字段中存储的内容。例如,将“two”和“II”转换为“2”等,删除其他单词,如“ON”和“AND”等。
全文搜索
MySQL FullText搜索使用“Natural Language”搜索。我不确定这是否适用于您的情况,但可能值得研究。
答案 1 :(得分:0)
我不会说这一定更好,但MySQL有正则表达式支持。 REGEXP
答案 2 :(得分:0)
将任何用户输入直接传递给SQL调用会使您的代码容易受到SQL注入攻击,这是一种安全风险,以及您发现它并不总能提供预期结果。要解决此问题,建议开发人员使用预准备语句或转义输入[有时称为清理输入]。有关更多信息,请参阅以下内容:What's the best method for sanitizing user input with PHP?
答案 3 :(得分:0)
您可以使用此搜索字词。这对MySQL的多列搜索非常有用
$q = htmlspecialchars($_GET["q"], ENT_QUOTES, "ISO-8859-1");
$q = stripslashes($q);
$search_exploded = explode (" ", $q);
$construct = "";
$construct .=" CONCAT(title,' ',category,' ',subCategory,' ',description,' ',contact,' ',email,' ',website,' ',address) LIKE '%$q%' ";
foreach($search_exploded as $search_each)
{
$construct .=" OR CONCAT(title,' ',category,' ',subCategory,' ',description,' ',contact,' ',email,' ',website,' ',address) LIKE '%$search_each%' ";
}
$constructs ="SELECT * FROM content WHERE active='1' AND ($construct) ";
$run = mysql_query($constructs);
$foundnum = mysql_num_rows($run);
如果您愿意,我会提供更多信息