创建搜索功能


Creating a search function

我的搜索表单中有多个字段,我的查询适用于单个字段。我想要达到的是

1-查询应该工作,如果搜索是基于1个字段2-查询应该工作,如果搜索是基于多个字段输入

我的形式
<form class="sidebar-search  jumbro-search container list-inline center-block" method="get" action="search.php">
<div class="form-group col-md-2">
    <input list="location"  name="location" class="form-control" placeholder="Location">
    <datalist id="location">
        <?php 
            $loc="select * from locations";
            $results=mysqli_query($dbc,$loc);
            while($row_loc=mysqli_fetch_array($results)){
                echo '<option value='.$row_loc['region'].'>'.$row_loc['region'].'</option>';
            }
         ?>
    </datalist>
</div>
<div class="form-group col-md-2">
    <select class="form-control" name="category">
        <option selected>Category</option>
        <?php 
            $cat="select * from property_type order by type_name asc";
            $results=mysqli_query($dbc,$cat);
            while($row_cat=mysqli_fetch_array($results)){
                echo '<option value='.$row_cat['type_name'].'>'.$row_cat['type_name'].'</option>';
            }
         ?>
    </select>
</div>
    <div class="form-group col-md-2">
    <select class="form-control" name="status">
        <option selected>Status</option>
        <?php 
            $status="select * from property_status order by status_name asc";
            $results=mysqli_query($dbc,$status); 
            while($row_status=mysqli_fetch_array($results)){
                echo '<option value='.$row_status['status_name'].'>'.$row_status['status_name'].'</option>';
            }
         ?>
    </select>
</div>
<div class="form-group col-md-2">
    <input type="text" name="price-max" value="999999999999" class="form-control" placeholder="Max Price">
</div>
<div class="form-group col-md-2">
    <button class="btn btn-primary form-control">Search</button>
</div>

我的PHP脚本是这样的

// getting user data from search form
$location=$_GET['location'];
$category=$_GET['category'];
$status=$_GET['status'];


//scripts 
if($location!="location" && $category!="category" && $status!="status"){
  $query="select * from properties where `property_type` like '%$category%' && `location` like '%$location%' && `status` like '%$status%' ";
}
$query="select * from properties where `property_type` like '%$category%' or `location` like '%$location%' or `status` like '%$status%'";
$result=mysqli_query($dbc,$query);
if(mysqli_query($dbc,$query)) {
  $num_rows=mysqli_num_rows($result);
} else {
  echo 'Query failed';
}
$num_rows=mysqli_num_rows($result);

if($num_rows!=0){
  echo '<h3 class="page-header text-center">'.$num_rows.' Match Found</h3>';
while ($row=mysqli_fetch_array($result)) {

    <?php
}//end while
}else{
echo '<h3 class="page-header text-center">No Match Found, try adjusting your search criteria.</h3>';
include 'functions/latest-sc.php';
}

好吧,关于你应该在代码中修改什么,我有几个想法。

  1. 我强烈建议您将代表性逻辑(html和回显变量)与定义变量和处理数据库查询等功能分开。

  2. 你可以使用默认选项在你的选择与空值

    <option value="">Select none</option>
    

它将简化你的代码检查:

代替:

if($location!="location" && $category!="category" && $status!="status")

可以使用:

 if($location && $category && $status)
  • 阅读转义

  • 关于您的主要问题-您可以通过连接创建查询。我给你举个例子,你可以根据你的需要用"OR"或"and"代替:

    $sql = 'SELECT * FROM properties WHERE ';
    $scopes = [];
    foreach([$location,$category,$status] as $column => $condition) {
      if ($condition) {
        $scopes[] = $column.' LIKE ''%.$condition.'%''';
      }
    }
    $scopes = implode(' AND ',$scopes);
    $sql .= $scopes.';';
    // ...do what you need
    
  • 有很多关于编码的建议,但也许你只是像一个非常简单的例子,所以我跳过它。

  • 好的,我认为你问的是基于表中的多列的SELECT。下面是我的应用程序的脚本,从检查主队和客场队的表中选择记录:-

    <?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "localdb";
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);
    // Check connection
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    } 
    $sql = "SELECT hometeam FROM stats WHERE hometeam = 'Man City' AND awayteam = 'Sunderland'";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        // output data of each row
        while($row = $result->fetch_assoc()) {
            echo $row['hometeam'];
        }
    } else {
        echo "0 results";
    }
    $conn->close();
    ?>
    

    应该可以:

    $data = [
        'property_type' => 'category_value', //$_GET['location']
        'category' => 'location_value', //$_GET['category']
        'status' => 'status_value' //$_GET['status']
    ];
    $select = "";
    $params = 0;
    foreach($data as $k => $v){
        if($params > 0){
            $select .= " or ";
        }
        //add some better conditions 
        if(strlen($v) > 0){
            $select .= "`$k` LIKE %$v%";
            $params++;
       }
    }
    $query = "select * from properties where " . $select;
    print_r($query);