Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 类似Mysql查询的搜索和使用带符号的字符串_Php_Mysql_Search_Sql Like_Symbols - Fatal编程技术网

Php 类似Mysql查询的搜索和使用带符号的字符串

Php 类似Mysql查询的搜索和使用带符号的字符串,php,mysql,search,sql-like,symbols,Php,Mysql,Search,Sql Like,Symbols,我的问题是搜索查询中使用了符号。我希望用户能够使用符号而不会成为问题,但mysql中的LIKE函数似乎不是解决方案,所以我需要一些帮助 示例:如果有人搜索“Blue’s car”并且“Blues car”在数据库中,则此查询将返回0个结果。反之亦然,如果有人搜索“Blues car”并且“Blue’s car”在数据库中,则此查询也将返回0个结果 这是我目前使用的一个示例: ("SELECT Title FROM MyData WHERE Title LIKE '%".$search."%'")

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

示例:如果有人搜索“Blue’s car”并且“Blues car”在数据库中,则此查询将返回0个结果。反之亦然,如果有人搜索“Blues car”并且“Blue’s car”在数据库中,则此查询也将返回0个结果

这是我目前使用的一个示例:

("SELECT Title FROM MyData WHERE Title LIKE '%".$search."%'")
有没有其他方法可以提供更好的搜索结果


谢谢。

我不认为这一定更好,但MySQL支持正则表达式

我不认为这一定更好,但MySQL支持正则表达式

将任何用户输入直接传递到SQL调用会使您的代码可能容易受到SQL注入攻击,这是一种安全风险,而且您发现它并不总能提供预期的结果。为了解决这个问题,建议开发人员使用准备好的语句或转义输入[有时称为清除输入]。有关更多信息,请参见以下内容:

将任何用户输入直接传递到SQL调用会使代码可能容易受到SQL注入攻击,这是一种安全风险,而且您发现它并不总能提供预期的结果。为了解决这个问题,建议开发人员使用准备好的语句或转义输入[有时称为清除输入]。有关更多信息,请参见以下内容:

搜索字段

您可以有一个附加的“搜索”字段,该字段存储标题而不使用标点符号,当用户输入搜索字符串时,在应用查询之前去掉标点符号。您还可以删除前导的“The”

我将进一步解释上述内容

在数据库中有这样一个记录。SearchTitle是删除了前导“The”和标点符号的标题:

Title                  SearchTitle
------------------------------------------
The Blue's Clues       Blues Clues
在此,用户知道确切的标题并输入以下搜索字符串:

The Blue's Clues
去掉前导的“the”和标点符号,得到以下结果:

Blues Clues
Blues Clues
您的查询如下所示

SELECT Title FROM MyData WHERE SearchTitle LIKE '%Blues Clues%'
在此,用户不知道确切的标题,输入以下内容:

Blues Clues
Blues Clues
去掉前导的“the”和标点符号,仍然会得到相同的结果:

Blues Clues
您的查询保持不变,并与搜索字段中的内容匹配:

SELECT Title FROM MyData WHERE SearchTitle LIKE '%Blues Clues%'
这是可以进一步改进的。关键是对搜索字符串应用与搜索字段中存储的内容相同的规则。例如,将“2”和“II”转换为“2”等,删除诸如“ON”和“and”等附加词语

全文搜索


MySQL全文搜索使用“”搜索。我不确定这对你的情况是否有用,但它可能值得研究。

搜索字段

您可以有一个附加的“搜索”字段,该字段存储标题而不使用标点符号,当用户输入搜索字符串时,在应用查询之前去掉标点符号。您还可以删除前导的“The”

我将进一步解释上述内容

在数据库中有这样一个记录。SearchTitle是删除了前导“The”和标点符号的标题:

Title                  SearchTitle
------------------------------------------
The Blue's Clues       Blues Clues
在此,用户知道确切的标题并输入以下搜索字符串:

The Blue's Clues
去掉前导的“the”和标点符号,得到以下结果:

Blues Clues
Blues Clues
您的查询如下所示

SELECT Title FROM MyData WHERE SearchTitle LIKE '%Blues Clues%'
在此,用户不知道确切的标题,输入以下内容:

Blues Clues
Blues Clues
去掉前导的“the”和标点符号,仍然会得到相同的结果:

Blues Clues
您的查询保持不变,并与搜索字段中的内容匹配:

SELECT Title FROM MyData WHERE SearchTitle LIKE '%Blues Clues%'
这是可以进一步改进的。关键是对搜索字符串应用与搜索字段中存储的内容相同的规则。例如,将“2”和“II”转换为“2”等,删除诸如“ON”和“and”等附加词语

全文搜索


MySQL全文搜索使用“”搜索。我不确定这对你是否有用,但它可能值得研究。

你可以使用这个搜索词。这对于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);

如果您需要,我将提供更多信息

您可以使用此搜索词。这对于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);

如果您需要,我将提供更多信息

在输入查询之前,我实际上正在使用mysql\u escape\u字符串以及preg\u替换某些符号。但是不管怎样,谢谢你提供的信息。是的,我刚刚检查了一下,这就是我正在使用的。在输入查询之前,我实际上对某些符号使用了mysql\u escape\u string和preg\u replace。但是不管怎样,谢谢你提供的信息。是的,我刚刚检查过,这就是我正在使用的。是的,但是如果我想保留某些标题符号呢?在查询返回0结果之前对字符串进行条带化。很抱歉,我一开始不理解您的解决方案,我想我读得太快了。但听起来是个好办法。我要试一试。谢谢,但是如果我想保留某些标题符号呢?在查询返回0结果之前对字符串进行条带化。很抱歉,我一开始不理解您的解决方案,我想我读得太快了。但听起来是个好办法。我要试一试。谢谢