2015-06-28 42 views
4

我有一个搜索表单搜索产品在MySQL全文比赛,该表产品包含:表MySQL的搜索关键字OR或AND或反对

1)ID

2)条码

3)PRODUCT_NAME

4)制造商

5)模型

我有更多的领域,如价格税等,但他们现在并不重要。

随着下面的代码我正在搜索数据库,它工作得很好,但现在有一个问题。下面是代码

首先HTML表单

<form method="post" name="search"> 
<input type="text" name="keywords" value="..."> 
<input type="submit" value="search"> 
</form> 

现在PHP和MySQL的代码

$searchterms= mysqli_real_escape_string($database,$_POST['keywords']); 
$result=mysqli_query($db," 
    SELECT * FROM `products` 
WHERE `barcode` LIKE '%$searchterms%' 
OR `product_name` LIKE '%$searchterms%' 
OR `model` LIKE '%$searchterms%' 
OR `manufacturer` LIKE '%$searchterms%' 
"); 
$rows=mysqli_num_rows($result); 
if(mysqli_num_rows($result)>0){ 
?> 

我试图全文搜索,但我得到的错误

$searchterms=  mysqli_real_escape_string($database,$_POST['keywords']); 
$result=mysqli_query($database,"SELECT * FROM products 
    WHERE MATCH (product,manufacturer,model) 
AGAINST ('$searchterms' IN NATURAL LANGUAGE MODE);"); 
    $rows=mysqli_num_rows($result); 
    if(mysqli_num_rows($result)>0){ 
    ?> 

错误文本 警告:mysqli_num_rows()期望参数1到be mysqli_result,布尔在给出

正如你所看到和理解的,我有一个输入文本在数据库中搜索。

如果我搜索关键字:“三星”,那么我从制造商三星获得产品。

如果我搜索模式“S6边缘”然后我得到与模型S6或S6边缘产品

如果我用2名字的关键字“三星S6”的搜索结果为空

任何想法为什么?

编辑:

以下是完整的代码,我使用的小提琴

https://jsfiddle.net/psnf0arw/

这将是更容易理解看PHP代码完整

+0

有没有从'samsung'开始并以's6'结尾或包含它的条形码? – Yang

+1

https://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html –

+0

条码只有当我扫描产品条码来搜索产品时才有效,问题出在我想要搜索时2个关键字,比如(制造商,型号),例如“三星S6” –

回答

1

如果您的意图是在任何这些字段中找到任何关键字,您可以尝试使用REGEXP而不是LIKE。

$searchterms = mysqli_real_escape_string($database,$_POST['keywords']); 
$searchexp = implode("|", str_word_count($searchterms, 1)); 
$result=mysqli_query($db," 
    SELECT * FROM `products` 
     WHERE `barcode` REGEXP '$searchexp' 
     OR `product_name` REGEXP '$searchexp' 
     OR `model` REGEXP '$searchexp' 
     OR `manufacturer` REGEXP '$searchexp' 
"); 
+0

我现在检查并测试它 –

+0

它工作得很好,它给我的结果,但很多结果 –

+0

你能更具体吗? – JME

0

首先的。当你使用特定的型号名称的查询将被设置好的像 说:

选择 * FROM products WHERE barcode LIKE '%三星S6%' 或 product_name LIKE '%三星S6%' OR model LIKE '%三星S6%' 或 manufacturer LIKE '%三星S6%'

将返回任何结果,因为there's没有匹配的型号名称等于 '三星S6' 。该代码处理搜索条件就像一个单一的字符串'samsung s6',如果不匹配不返回任何东西。

+0

和解决方案是? –

+0

我相信在这种情况下最好使用: ** SELECT * FROM产品WHERE条码LIKE'%samsung%'或product_name LIKE'%samsung%'或型号LIKE'%samsung%'或制造商LIKE'%samsung% '** –