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