创建搜索功能

时间:2016-09-09 07:12:25

标签: php mysql search

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

如果搜索基于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';
}

3 个答案:

答案 0 :(得分:2)

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

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

  2. 您可以在带空值的选择中使用默认选项

    <option value="">Select none</option>
    
  3. 它将简化您的检查代码:

    而不是:

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

    可以使用:

     if($location && $category && $status)
    
    1. 了解escaping

    2. 在您的主要问题上 - 您可以通过连接创建查询。我举个例子,你可以用&#39; OR&#39;替换它。或者&#39; AND&#39;满足您的需求:

      $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
      
    3. 有很多关于编码的建议但是你可能只是把它简单地呈现出来,所以我跳过它。

答案 1 :(得分:0)

这应该有效:

$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);

答案 2 :(得分:0)

好的,我想你要问的是一个基于表中多列的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();
?>