0

我试图从数据库中搜索产品。

我的数据库:

tbl_brand
-----------
brand_id Brand_name
1        Canon
2        Nikon

tbl_product
-------------
prod_id  prod_name                                                    brand_id
1        Canon PowerShot A810 16MP Point & Shoot Digital Camera       1
2        Canon Digital Camera PowerShot 8MP Point & Shoot             1
3        PowerShot 8MP Point & Shoot Digital Camera                   1
4        PowerShot 8MP Point & Shoot Digital                          1

我的搜索关键字:

  1. $keyword = 'Camera';
  2. $keyword = 'Digital Camera';
  3. $keyword = 'Canon Digital Camera';
  4. $keyword = 'Canon Camera';

我的查询

Select * from tbl_product where prod_name like '%$keyword%'

我得到了前三个关键字的结果。但是对于第四个关键字,我得到的结果是空的。

佳能相机 - 关键字与产品名称不匹配。但是所有的产品都是佳能品牌,所有的产品都是相机而已。

我需要显示“佳能相机”关键字的所有产品。我是 php 和 mysql 的新手。请在这方面提供帮助。

4

7 回答 7

7

试试这个MATCH .. AGAINST

以下是如何让它工作:

  1. 首先确保您的表使用 MyISAM 存储引擎。MySQL FULLTEXT 索引仅支持 MyISAM 表。(编辑 11/1/2012: MySQL 5.6 正在为 InnoDB 表引入 FULLTEXT 索引类型。)

    ALTER TABLE tbl_product ENGINE=MyISAM;
    
  2. 创建全文索引。

    CREATE FULLTEXT INDEX searchindex ON tbl_product(prod_name);
    
  3. 搜索一下!

    $keyword = mysql_real_escape_string($keyword);
    $query = mysql_query("SELECT * FROM tbl_product 
        WHERE MATCH(prod_name) AGAINST('$keyword')");
    

    请注意,您在MATCH子句中命名的列必须与您在全文索引定义中声明的列的顺序相同。否则它将无法正常工作。

于 2013-05-22T14:26:34.133 回答
4

用这个:-

$keywords = explode(' ', $keyword);
$searchTermKeywords = array();
foreach ($keywords as $word) 
{

$searchTermKeywords[] = "prod_name LIKE '%$word%'";

}

$result= mysql_query("SELECT * FROM tablename WHERE ".implode(' AND ', $searchTermKeywords).");

说明:- 在这段代码中,我使用空格分割搜索关键字并将其存储到数组中。之后,我将 sql 字符串添加到数组中。没有。元素的数量取决于用户输入的搜索词的数量。在 mysql_query 函数中,我使用 AND 对数组进行内爆,执行后将如下所示(对于“数码相机”关键字):-

SELECT * FROM tablename WHERE prod_name LIKE '%digital%' AND prod_name LIKE '%camera%'
于 2013-05-22T13:14:25.150 回答
1
$keywords = explode(' ', $keyword);
foreach($keywords as $words) {
$x++
if($x == 1) {
    $searchterm .= "prod_name LIKE %$words%";
}else {
    $searchterm .= " OR prod_name LIKE %$words%";
}
}
Select * from tbl_product where prod_name like '%$searchterm%';

它会搜索你输入的每个单词

于 2013-05-22T14:09:55.870 回答
0

您的数据库中根本没有“佳能相机” :) 您的代码完全没问题。使用此搜索 %'Canon Camera'% 您可以在字符串之前和之后获取所有内容,但您必须在中间有确切的字符串 'Canon Camera'。

于 2013-05-22T13:08:48.527 回答
-1
<?php include "header.php"; ?>

        <div id="page-wrapper">

            <div class="container-fluid">

                <!-- Page Heading -->
                <div class="row">
                    <div class="col-lg-12">
                         <?php
$query = $_GET['query']; 
    $min_length = 1;
  if(strlen($query) >= $min_length)
  { 
        $query = htmlspecialchars($query); 
        $query = mysqli_real_escape_string($con, $query);  

  echo "<h4>Your match result(s) for <font color=#B22222>$query</font></h4>
  <hr>";
  //select 2 tables - search
  $result = mysqli_query($con, "SELECT category_name, image, category_id, datetime, description, category_id FROM category 
  WHERE (`category_name` LIKE '%" .$query. "%') 
  UNION SELECT product_name, image, product_id, datetime, description, category_id FROM products WHERE (`product_name` LIKE '%" .$query. "%' )
  UNION SELECT username, fname, lname, email, contact, user_id FROM users WHERE (`username` LIKE '%" .$query. "%' )
  ") or die(mysqli_error()); 


        if (mysqli_num_rows($result) > 0)
  {
            while($info = mysqli_fetch_array($result))
   { 
        echo "";  ?>

        <?php Print ""  ?>
         <div class="row">
            <div class="col-md-7">
                <a href="#">
                    <img width="280" height="250" src="<?php echo $info['image']; ?>" alt="">
                </a>
            </div>
            <div class="col-md-5">
               <?php 
        if (strpos($info, '') === true)

        {  Print "<h4><a href='view_cat.php?category_id=".$info['category_id']."'>".$info['category_name']."</a></h4>";  }

    else if (strpos($query, 'username') === true)
    { Print "<h4><a href='view_cat.php?category_id=".$info['category_id']."'>".$info['username']."</a></h4>"; }



               ?>
                <hr>
                <h4>Added at: <?php echo date("d-M-Y", strtotime($info['datetime'])); ?></h4>
                <h4>Description: <?php echo $info['description']; ?></h4>
            </div>
        </div>
        <?php "";

            }

           }
        else { 
            echo "<p>
            <img src='../image/alert.png'><br />
            <h4>Sorry... No results for $query</h4>"; 
   echo "";  
        }   
    }
    else{ 
        echo "<h4>Search empty field. Please input your category name</h4>";
    }
?>
                    </div>
                </div>
                <!-- /.row -->

            </div>`enter code here`
            <!-- /.container-fluid -->

        </div>
        <!-- /#page-wrapper -->

    </div>
    <!-- /#wrapper -->`enter code here`

<?php include "footer.php"; ?>
于 2017-06-01T03:50:27.463 回答
-2
$keywords = str_replace(' ','%',$keywords);
Select * from tbl_product where prod_name like '%$keyword%'
于 2013-05-22T13:00:55.330 回答
-2

你可以试试这个...

$keyword = 'Canon Camera';
$keys = explode(" ",$keyword);
$sql = "SELECT * FROM tbl_product WHERE ";

//$wheresql = "prod_name LIKE '".$keyword."'";
$wheresql = "1=2 OR ";

foreach ($keys as $key) {
$wheresql .= " OR prod_name LIKE '".$key."' ";
}
print_r($sql.$wheresql);
于 2013-05-22T13:21:20.907 回答