PHP поиск MySQL с несколькими критериями

У меня есть поисковая форма на веб-сайте, и я хотел бы иметь несколько поисковых терминов, которые пользователь вводит для поиска в БД, как указано ниже:

  • Ключевые слова
  • Недвижимость для (продажа, аренда …)
  • Тип недвижимости (Квартира, Дом с террасой …)
  • государственный
  • Минимальная цена
  • Максимальная цена

Вот скрипт для поиска с указанным выше термином

public function get_property_list_by_search($start, $per_page, $keyword, $prop_for, $min, $state, $ptype, $max, $mysqli)
{
if(empty($start) && empty($per_page))
{
return 0;
}

$start = preg_replace('/[^0-9]/', '', $mysqli->real_escape_string($start));
$per_page = preg_replace('/[^0-9]/', '', $mysqli->real_escape_string($per_page));
$keyword = $mysqli->real_escape_string(stripslashes($keyword));
$prop_for = $mysqli->real_escape_string(stripslashes($prop_for));
$state = $mysqli->real_escape_string(stripslashes($state));
$ptype = $mysqli->real_escape_string(stripslashes($ptype));
$min_price = self::num_clean($mysqli->real_escape_string($min));
$max_price = self::num_clean($mysqli->real_escape_string($max));

$t1 = '';
$t2 = '';
$t3 = '';
$t4 = '';
$t5 = '';

if(isset($keyword) && !empty($keyword)){
$t1 = " AND `proj_title` LIKE '%".$keyword."%' OR `proj_addr` LIKE '%".$keyword."%' OR `proj_area` LIKE '%".$keyword."%'";
}
if(isset($prop_for) && !empty($prop_for)){
$t2 = " AND `proj_for`='".$prop_for."'";
}
if(isset($state) && !empty($state)){
$t3 = " AND `state`='".$state."'";
}
if(isset($ptype) && !empty($ptype)){
$t4 = " AND `proj_cat`='".$ptype."'";
}
//min & max
if((isset($min_price) && !empty($min_price)) && (isset($max_price) && !empty($max_price))){
$t5 = " AND `price` BETWEEN '".$min_price."' AND '".$max_price."'";
}
//min only
if(!empty($min_price) && empty($max_price)){
$t5 = " AND `price` >= '".$min_price."'";
}
//max only
if(empty($min_price) && !empty($max_price)){
$t5 = " AND `price` <= '".$max_price."'";
}

$sql = $mysqli->query("SELECT * FROM `project` WHERE `status`='1' ".
$t1." ".$t2." ".$t3." ".$t4." ".$t5." ".
"ORDER BY `posted_date` DESC LIMIT ".$start.", ".$per_page);

if($sql->num_rows > 0){
return $sql;
}else{
return false;
}
}

Вывод запроса будет выглядеть примерно так:

SELECT * FROM `project`
WHERE `proj_title` LIKE '%keywords%'
OR `proj_addr` LIKE '%keywords%'
OR `proj_area` LIKE '%keywords%'
AND `proj_for`='Sale' AND `state`='Somewhere' AND `proj_cat`='8' AND `price` BETWEEN '250000' AND '600000'

(Тип данных для price является DECIMAL(10,2)хранится значение как 250000.00)

Тем не менее, возвращаемые результаты не соответствуют ожидаемым (не точным), они также получат результат с ценой более 600000 и категорией проекта, которая находится за пределами «8», что не является интересным для конечного пользователя при поиске на веб-сайте.

Есть ли способ уточнить запрос, чтобы выполнить более конкретно?

1

Решение

Вместо того, чтобы брать эти переменные, вы должны использовать оператор «. =».

/*      $t1 = '';
$t2 = '';
$t3 = '';
$t4 = '';
$t5 = '';
*/
$q = "SELECT * FROM `property` WHERE `status`='1' ";

// You need to enclose all **OR** logical tests in parenthesis.
// Moreover most of the usages of isset function are useless,
// as your are initializing many variables

if($keyword && !empty($keyword)){
$q .= " AND (`p_title` LIKE '%".$keyword."%' OR `address` LIKE '%".$keyword."%' OR `area` LIKE '%".$keyword."%')";
}
if($prop_for && !empty($prop_for)){
// If you are using double quotes you really don't need  handle to concatenation.
$q .= " AND `p_for`='$prop_for'";
}
if($state && !empty($state)){
$q .= " AND `state`='$state'";
}
if($ptype && !empty($ptype)){
$q .= " AND `p_category`='$ptype'";
}
//min only
if($min_price && !empty($min_price)){
$q .= " AND `price` >= '".$min_price."'";
}
//max only
if($max_price && !empty($max_price)){
$q .= " AND `price` <= '$max_price'";
}

// When you are not using OFFSET keyword,
//the first number after LIMIT keyword should be the number of records
$q .= " ORDER BY `posted_date` DESC LIMIT $per_page , $start;";
$sql = $mysqli->query($q);
1

Другие решения

Вам понадобятся скобки.

SELECT * FROM `project` WHERE (`proj_title` LIKE '%keywords%' OR `proj_addr` LIKE '%keywords%' OR `proj_area` LIKE '%keywords%') AND `proj_for`='Sale' AND `state`='Somewhere' AND `proj_cat`='8' AND `price` BETWEEN '250000' AND '600000'

Без скобок он просто должен соответствовать одному из критериев перед последним ИЛИ.

1

if(isset($_SESSION['login']))
{
echo "<div align=\"right\"><strong><a href=\"index.php\"> Home </a>|
<a href=\"signout.php\">Signout</a>|
<a href=\"home.php\">Profile</a></strong></div>";}
else
{
echo "&nbsp;";
}

$con=  mysql_connect("localhost","root","");
$d=mysql_select_db("matrimonial",$con);
$gender=$_POST['gender'];
$age1=$_POST['age1'];
$age2=$_POST['age2'];
$city=$_POST['city'];
$subcast=$_POST['subcast'];
$result=mysql_query("select * from matri where gender='$gender' and age between '$age1' and '$age2' and city='$city' and subcast='$subcast'");

if($gender && !empty($gender))
{
$result .= " AND `gender`='$gender'";
}

if($age1 && !empty($age1)){
$result .= " AND `age`='$age1'";
}
if($age2 && !empty($age2)){
$result .= " AND `age`='$age2'";
}

if($city && !empty($city)){
$result .= " AND `city`='$city'";
}

if($subcast && !empty($subcast)){
$result .= " AND `subcast`='$subcast'";
}

$result .= " select * from ";

$sql = $mysql->query($result);
how to run this code
0