Как создать поле поиска php-тега с условиями AND и OR? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь создать поле поиска, в котором люди могут искать по тегам, которые сохранены в нашей базе данных (ajax).Проблема заключается в том, что я хочу, чтобы пользователь мог выполнять поиск по тегам контента, где контент ДОЛЖЕН иметь прикрепленные теги, которые включают все теги, которые использовались для поиска.Допустим, я ищу «bwm red», я хочу показывать контент только с прикрепленными тегами «bmw» и «red».Так что НЕТ контента только с одним из двух тегов.

Кроме того, пользователь может искать теги, которые являются необязательными, поэтому предположим, что пользователь ищет «красный желтый», результаты должны содержать теги «красный» или «желтый», где они также совпадают.с обязательным полем поиска.Таким образом, вы получите очень специфический поиск.

На этой фотографии я включил дизайн того, как должно работать поле поиска, и должно быть более понятно, что я пытаюсь создать.

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";
    }
}

1 Ответ

0 голосов
/ 10 апреля 2019

Вам необходимо использовать 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 не выдает дубликаты записей, поэтому вам не нужно беспокоиться о появлении повторяющихся значений.

В случае любой проблемы, сообщите мне в комментариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...