Фильтрация поиска с помощью PHP/MySQL

Я пытаюсь создать параметр поиска/фильтрации в приложении для донора крови. Когда донора можно искать по полу, имени, группе крови или путем выбора всех трех. Вот мой код

function search_donar($_POST) {

        $by_name = $_POST['by_name'];
        $by_sex = $_POST['by_sex'];
        $by_group = $_POST['by_group'];
        $by_level = $_POST['by_level'];

        $search_query = "SELECT * FROM donar WHERE";
        if($by_name !="") {
          $search_query .= " name='$by_name'";
        }
        if($by_sex !="") {
          $search_query .= " sex='$by_sex'";
        }
        if($by_group !="") {
          $search_query .= " blood_group='$by_group'";
        }
        if($by_level !="") {
          $search_query .= " e_level='$by_level'";
        }
        $search_query;
        $result = mysql_query($search_query);

        return $result;
    }

И вот html

if(isset($_POST['submit'])) {

    $retrived_result = $donar->search_donar($_POST);

}

   <form action="" method="post">
    <table width="100%" border="0" style="border:none;">
      <tr>
        <td><label>Name:&nbsp;</label><input type="text" name="by_name" /></td>
        <td><label>Sex:&nbsp;</label><input type="text" name="by_sex" /></td>
        <td><label>Blood Group:&nbsp;</label><input type="text" name="by_group" /></td>
        <td><label>Level:&nbsp;</label><input type="text" name="by_level" /></td>
        <td><input class="button" type="submit" name="submit" value="Search" /></td>
      </tr>
    </table>
    </form>

Одиночная фильтрация работает очень хорошо. Но для фильтрации со всеми, что я использовал AND, но это дает мне ошибку. Может ли кто-нибудь помочь?

Заранее спасибо

Ответ 1

Как и все остальные сообщения, вам нужно будет добавить все условия с помощью AND. Это самый чистый ответ. Помните, что вы действительно избегаете своих строк, хотя используйте метод mysqli OOP вместо старого mysql. Просто предложение.

Вот пример типичного запроса.

Правильный способ:

SELECT * FROM donar WHERE name='dxenaretionx' AND sex='M';

Как вы это делаете

SELECT * FROM donar WHERE name='dxenaretionx' sex='M';

код:

function search_donar($_POST) {
    $by_name = $_POST['by_name'];
    $by_sex = $_POST['by_sex'];
    $by_group = $_POST['by_group'];
    $by_level = $_POST['by_level'];

    //Do real escaping here

    $query = "SELECT * FROM donar";
    $conditions = array();

    if(! empty($by_name)) {
      $conditions[] = "name='$by_name'";
    }
    if(! empty($by_sex)) {
      $conditions[] = "sex='$by_sex'";
    }
    if(! empty($by_group)) {
      $conditions[] = "blood_group='$by_group'";
    }
    if(! empty($by_level)) {
      $conditions[] = "e_level='$by_level'";
    }

    $sql = $query;
    if (count($conditions) > 0) {
      $sql .= " WHERE " . implode(' AND ', $conditions);
    }

    $result = mysql_query($sql);

    return $result;
}

Ответ 2

Следующий фрагмент кода:

$search_query = "SELECT * FROM donar WHERE";
if($by_name !="") {
  $search_query .= " name='$by_name'";
}
if($by_sex !="") {
  $search_query .= " sex='$by_sex'";
}

создает такие запросы, как

SELECT * FROM donar WHERE name='nowak' sex='m'

которые недействительны, поскольку между предложениями нет логического оператора. Вам нужно добавить "И". Чтобы упростить код, вы можете создавать условия в виде "true и a and b...":

$search_query = "SELECT * FROM donar WHERE true";
if($by_name !="") {
  $search_query .= " AND name='$by_name'";
}
if($by_sex !="") {
  $search_query .= " AND sex='$by_sex'";
}
...

Ответ 3

В вашем коде есть проблема в запросе, где условие. Здесь ваш запрос будет похож select * from donar where by_name = "A" by_group = "N" нет And/Or, чтобы сделать, где условие выполнено правильно. Пожалуйста, попробуйте код, как показано ниже.

$search_query = "SELECT * FROM donar";
$query_cond = "";

if($by_name !="") {
      $query_cond .= " name='$by_name'";
}
if($by_sex !="") {

      if(!empty($query_cond)){
          $query_cond .= " AND ";
       }

      $query_cond .= " sex='$by_sex'";
}

if($by_group !="") {

      if(!empty($query_cond)){
          $query_cond .= " AND ";
       }

      $query_cond .= " blood_group='$by_group'";
}

if($by_level !="") {

      if(!empty($query_cond)){
          $query_cond .= " OR ";
       }

      $query_cond .= " e_level='$by_level'";
 }

 if(!empty($query_cond)){
      $query_cond = " Where ".$query_cond;
      $search_query.$query_cond;
 }

Здесь в коде сначала берем переменную $query_cond пустую и выполняем условие в соответствии с кодом. и управляйте оператором AND в соответствии с этим. И в последнем случае, если мы нашли $query_cond непустым, добавим его в $select_query.

Я надеюсь, что это будет полезно для вас.

спасибо

Ответ 4

Попробуйте вот так:

function search_donar($_POST) {

        $by_name = $_POST['by_name'];
        $by_sex = $_POST['by_sex'];
        $by_group = $_POST['by_group'];
        $by_level = $_POST['by_level'];

        $isfirst=0;
        $search_query = "SELECT * FROM donar WHERE";
        if($by_name !="") {

          $search_query .= " name='$by_name'";
          $isfirst=1;
        }
        if($by_sex !="") {
            if($isfirst!=0)
            $search_query .= " AND ";
          $search_query .= " sex='$by_sex'";
          $isfirst=1;
        }
        if($by_group !="") {
            if($isfirst!=0)
            $search_query .= " AND ";
          $search_query .= " blood_group='$by_group'";
          $isfirst=1;
        }
        if($by_level !="") {
            if($isfirst!=0)
            $search_query .= " AND ";
          $search_query .= " e_level='$by_level'";
          $isfirst=1;
        }
        $result = mysql_query($search_query);

        return $result;
    }

Ответ 5

В этом случае, когда вы не используете проверку, рекомендуется не использовать, является ли поле ПУСТОЙ или НЕ. Попробуйте под кодом, надеюсь, он будет работать

function search_donar($_POST) {

    $by_name = $_POST['by_name'];
    $by_sex = $_POST['by_sex'];
    $by_group = $_POST['by_group'];
    $by_level = $_POST['by_level'];

    $search_query = "SELECT * FROM donar WHERE name LIKE '%$by_name%' AND sex LIKE '%$by_sex%' AND blood_group LIKE '%$by_group%' AND  e_level LIKE '%$by_level%' ";

    $result = mysql_query($search_query);

    return $result;
}

Ответ 6

Я создал фильтр и разместил его в учебнике. Фильтр основан на базе данных MySQL, вы можете загрузить файлы и изменить базу данных самостоятельно, тогда все, что вам нужно, это встроить фильтр в ваш проект. надеюсь, это поможет :) https://how2createafilterinphpmysql.home.blog/