Фильтрация поиска с помощью 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, но это дает мне ошибку. Может ли кто-нибудь помочь?

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

Как и все другие сообщения, вам нужно будет добавить все условия с помощью 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; } 

Там в вашем коде есть проблема в запросе, где условие. Здесь ваш запрос будет похож на select * from donar where by_name = "A" by_group = "N" отсутствует No 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 .

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

благодаря

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

 $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 и 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'"; } ... 

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

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

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

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