Mysql查询LIKE搜索并使用带符号的字符串

时间:2012-02-03 16:58:19

标签: php mysql search sql-like symbols

我的问题是在搜索查询中使用了符号。我希望用户能够使用符号而不会出现问题,但是mysql中的LIKE函数似乎不是解决方案所以我需要一些帮助。

示例:如果有人在数据库中搜索“Blue's car”和“Blues car”,则此查询将返回0结果。或者viseversa,如果有人在数据库中搜索“Blues car”和“Blue's car”,则此查询也将返回0结果。

这是我目前正在使用的一个例子:

("SELECT Title FROM MyData WHERE Title LIKE '%".$search."%'")

还有其他方法可以提供更好的搜索结果吗?

感谢。

4 个答案:

答案 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);

如果您愿意,我会提供更多信息