Я пытаюсь создать параметр поиска / фильтрации в приложении для донора крови. Когда донора можно искать по полу, имени, группе крови или путем выбора всех трех. Вот мой код
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: </label><input type="text" name="by_name" /></td> <td><label>Sex: </label><input type="text" name="by_sex" /></td> <td><label>Blood Group: </label><input type="text" name="by_group" /></td> <td><label>Level: </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; }