php - 如何使用 AND 和 OR 条件创建 php 标签搜索字段?

标签 php mysql ajax search tags

我正在尝试创建一个搜索字段,人们可以使用保存在我们数据库(ajax)中的标签进行搜索。问题是我希望用户能够使用标签搜索内容,其中内容必须附加标签,其中包括用于搜索的所有标签。假设我搜索“bwm red”,我只想显示带有“bmw”和“red”标签的内容。因此,没有内容仅包含两个标签之一。

此外,用户可以搜索可选的标签,假设用户搜索“红黄”,结果应该包含“红色”或“黄色”标签,其中也与 MUST 匹配搜索字段。通过这样做,您可以获得非常具体的搜索。

在这里的照片中,我已经包含了搜索字段应如何工作的设计,并且应该更清楚我正在尝试创建的内容。

enter image description here

我还编写了一些代码,但是正如您所看到的,它并没有按照我想要的方式工作。

知道如何解决这个问题吗?

<form action="search.php" method="post" >
    <h2>Search Keywords:</h2>
    <h3>MUST</h3>
    <input type="text" name="must">
    <h3>Optional</h3>
    <input type="text" name="keyword">
    <input type="submit" value="Search">
</form>
if(!empty($_POST))
{
      $aMust = explode(" ", $_POST['must']);
      $aKeyword = explode(" ", $_POST['keyword']);
      $query ="SELECT * FROM table1 WHERE field1 like '%" . $aKeyword[0] . "%'";

     for($i = 1; $i < count($aKeyword); $i++) {
        if(!empty($aKeyword[$i])) {
            $query .= " OR field1 like '%" . $aKeyword[$i] . "%'";
        }
      }

     $result = $db->query($query);
     echo "<br>You have searched for keywords: " . $_POST['keyword'];

     if(mysqli_num_rows($result) > 0) {
        $row_count=0;
        echo "<br>Result Found: ";
        echo "<br><table border='1'>";
        While($row = $result->fetch_assoc()) {   
            $row_count++;                         
            echo "<tr><td> ROW ".$row_count." </td><td>". $row['field1'] . "</td></tr>";
        }
        echo "</table>";
    }
    else {
        echo "<br>Result Found: NONE";
    }
}

最佳答案

您需要使用 UNION 来获取记录并显示如下数据

$aMust = explode(" ", $_POST['must']);
$aKeyword = explode(" ", $_POST['keyword']);

$query ="SELECT * FROM table1 WHERE (";
for($i = 0; $i < count($aMust); $i++) {
    if( $i!=0 && $i != (count($aMust)-1) ) {
        $query .=" AND ";
    }
    if(!empty($aMust[$i])) {
        $query .=" field1 like '%" . $aMust[$i] . "%' ";
    }
}
$query .=" ) ";

if( count($aKeyword) > 0 ) {
   $query .= " AND (";
   for($i = 0; $i < count($aKeyword); $i++) {
      if( $i!=0 && $i != (count($aKeyword)-1) ) {
          $query .=" OR ";
      }
      if(!empty($aKeyword[$i])) {
         $query .= " field1 like '%" . $aKeyword[$i] . "%'";
      }
   }
   $query .= " ) ";
}

$query .=" UNION ";
$query .=" SELECT * FROM table1 WHERE (";
for($i = 0; $i < count($aMust); $i++) {
    if( $i!=0 && $i != (count($aMust)-1) ) {
        $query .=" AND ";
    }
    if(!empty($aMust[$i])) {
        $query .=" field1 like '%" . $aMust[$i] . "%' ";
    }
}
$query .=" ) ";

这将为您提供与可选值匹配以及与可选值不匹配但与必须值匹配的记录。

UNION 不会给出重复的记录,因此您不必担心出现重复的值。

如有任何问题,请在评论中告诉我。

关于php - 如何使用 AND 和 OR 条件创建 php 标签搜索字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55612616/

相关文章:

php - 以不同的宽度和高度保存裁剪后的图像

c# - 从 MySql 数据库读取平均值。 C# ASP.NET

PHP/MYSQL使用datediff显示mysql记录年龄

javascript - 如何用 JavaScript 编写这个爬虫?

php - 未为函数建立数据库连接

php 服务器找不到 curl.so

php - Mysql查询优化Multi Column Index解决这个慢?

ajax - AJAX CORS 的 Laravel CSRF token

Javascript if 语句未按预期工作

php - 使用 PHP 的 SOAP 在服务器端修改发送的 XML