Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.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_Html_Mysql_Search - Fatal编程技术网

Php MySQL返回缺少单词的结果

Php MySQL返回缺少单词的结果,php,html,mysql,search,Php,Html,Mysql,Search,我有一个网站,上面有一个搜索栏,出售手机和平板电脑。如果搜索Blackberry 9900,则不会返回任何结果,因为该产品名为Blackberry Bold 9900。我需要一个解决方案,显示相关的产品,如果一个字丢失 我试过这个: $words=explode("_",$name); foreach($words as $word){ $whereClause.= ' product_name LIKE "%'.$word.'%" OR'; } $whereClause=substr($

我有一个网站,上面有一个搜索栏,出售手机和平板电脑。如果搜索
Blackberry 9900
,则不会返回任何结果,因为该产品名为
Blackberry Bold 9900
。我需要一个解决方案,显示相关的产品,如果一个字丢失

我试过这个:

$words=explode("_",$name);
foreach($words as $word){
   $whereClause.= ' product_name LIKE "%'.$word.'%" OR';
}
$whereClause=substr($whereClause,0,-2);
$productQuery='SELECT * FROM products WHERE'.$whereClause.' AND status=1 AND deleted=0 ORDER BY product_order';

如果搜索Blackberry Bold 9900,则返回包含Blackberry的所有结果如何解决此问题以使结果具有相关性?

您需要研究使用,因为LIKE运算符在这里对您没有帮助。

更改

$whereClause.= ' product_name LIKE "%'.$word.'%" OR';

当然

这将只搜索名称包含搜索框中所有单词的产品(但不必仅搜索该单词)


也许MySQL全文搜索是更好的方法,但它只支持MySQL 5.6之前的MyISAM表。

如果您真的想使用like运算符,那么您可以尝试以下方法:

SELECT * 
FROM  products 
WHERE title LIKE  '%Blackberry%9900%'
我的意思是,一个操作符可以使用几个%字符

因此,您的代码将是:

$words=explode("_",$name);
$whereClause=' product_name LIKE "';
foreach($words as $word){
   $whereClause.= '%'.$word;
}
$whereClause.='%"';
$productQuery='SELECT * FROM products WHERE'.$whereClause.' AND status=1 AND deleted=0 ORDER BY product_order';
但是,如果您的产品表很大(可能超过60万行),那么这个表的速度会很慢。
所以最好使用全文,因为如果使用得当,它会更快,我知道。

在你的情况下-使用
而不是
。正确的解决方案是使用
全文
索引,而不是像使用mysql的匹配查询那样,
从产品中选择*,其中匹配(产品名称)与('$words'),状态=1,删除=0,按产品顺序
。使用mysql的匹配查询,这将满足您的需要,并将表类型更改为innodb或myisam(两个搜索中的第一个搜索是什么),搜索“PHP MySQL全文示例”。这里有一个:
SELECT * 
FROM  products 
WHERE title LIKE  '%Blackberry%9900%'
$words=explode("_",$name);
$whereClause=' product_name LIKE "';
foreach($words as $word){
   $whereClause.= '%'.$word;
}
$whereClause.='%"';
$productQuery='SELECT * FROM products WHERE'.$whereClause.' AND status=1 AND deleted=0 ORDER BY product_order';