【问题标题】:PHP Mysqli Advanced Search (Multi-Options)PHP Mysqli 高级搜索(多选项)
【发布时间】:2016-09-16 07:12:35
【问题描述】:

我正在尝试创建多选项搜索。我到处寻找,似乎找不到合适的解决方案,尽管很多网站都有这个。 所以我有我的 html 表单(为了不让你感到厌烦,它被截断了一点):

<form method="get" id="searchForm" name="searchForm" action="search-text.php" >
<select name="make" id="make">
<option value="">ANY MAKE</option>
<option value="make1">MAKE1</option>
<option value="make2">MAKE2</option>
</select>
<select name="model" id="model">
<option value="">ANY MODEL</option>
<option value="model1">MODEL1</option>
<option value="model2">MODEL2</option>                
</select>
<select name="minprice" id="minprice">
<option value="">ANY PRICE</option>
<option value="1">1</option>
<option value="2">2</option>                
</select>
<select name="maxprice" id="maxprice">
<option value="">ANY PRICE</option>
<option value="1">1</option>
<option value="2">2</option>                
</select>
</form>

然后在 search.php 页面上,我可以获得所有变量,但我正在努力编写 SELECT 查询。我尝试过使用 AND,但当然,这只有在设置了所有变量时才有效。我总共有 8 个可以设置的变量。 我什至试图做类似下面的事情,但显然不是要走的路。

SELECT * FROM search data where if(isset($make)) AND if(isset($model)) etc etc

非常感谢大家的帮助。任何建议将不胜感激。我正在尝试尽可能多地学习,但我真的坚持这一点。

更新:所以我做了一些创造性的实验,我觉得我已经接近了,只是无法让它工作:

$query = array();
if (!empty($_GET['vType'])) {
$query[] = "vType='$vType'";
}
if (!empty($_GET['make'])) {
$query[] = "make='$make'";
}
if (!empty($model)) {
$query[] = "model='$model'";
}
if (!empty($yearfrom)) {
$query[] = "minyear >'$yearfrom'";
}
if (!empty($yearto)) {
$query[] = "maxyear>'$yearto'";
}
if (!empty($minprice)) {
$query[] = "minPrice >'$minprice'";
}
if (!empty($maxprice)) {
$query[] = "maxyear >'$maxprice'";
}
if (!empty($location)) {
$query[] = "location='$location'";
}
if (empty($query)){
$where = "WHERE";
}else{
$where = "";
}   
$query = implode(' AND ', $query);
$sql = "SELECT * FROM searchdata $where $query";

$result = mysqli_query($conDB, $sql);
if (mysqli_num_rows($result) === 0) {
echo 'Nothing Found';
}
while ($row = $result->fetch_assoc()) {
echo $row['vType'];

我确定我在这里做错了什么。谢谢大家,非常感谢您的帮助

【问题讨论】:

  • 你有提交按钮吗?
  • 请具体说明您希望如何构建查询!

标签: php search mysqli


【解决方案1】:

你也可以这样做

$sql = "select * from table_name  where column = $param1"

if(isset($param2))
{
 $sql=. "and column2 = $param2"
}`
if(isset($param3))
{
 $sql=. "and column3 = $param3"
}`
if(isset($param4))
{
 $sql=. "and column4 = $param4"
}`

【讨论】:

  • 它与其他答案有何不同?
  • 我的参数是不同的
【解决方案2】:

几个小时后才弄明白。以为我会为您发布代码,以防其他人面临同样的问题。再次感谢您的所有回复: $query = array();

if (!empty($_GET['vType'])) {
$vType = $_GET['vType'];
$query[] = "vType='$vType'";
}
if (!empty($_GET['make'])) {
$make = $_GET['make'];
$query[] = "make='$make'";
}
if (!empty($_GET['model'])) {
$model = $_GET['model'];
$query[] = "model='$model'";
}
if (!empty($_GET['minyear'])) {
$yearfrom = $_GET['minyear'];
$query[] = "years>='$yearfrom'";
}
if (!empty($_GET['maxyear'])) {
$yearto = $_GET['maxyear'];
$query[] = "years<='$yearto'";
}
if (!empty($_GET['minPrice'])) {
$minprice = $_GET['minPrice'];
$query[] = "vPrice>='$minprice'";
}
if (!empty($_GET['maxPrice'])) {
$maxprice = $_GET['maxPrice'];
$query[] = "vPrice<='$maxprice'";
}
if (!empty($_GET['location'])) {
$location = $_GET['location'];
$query[] = "location='$location'";
}
if (!empty($query)){
$where = "WHERE";
}else{
$where = "";
}

$searchquery = implode(' AND ', $query);
$getsearch = "SELECT * FROM searchdata $where $searchquery";

$ressearch = mysqli_query($conDB, $getsearch);
if (mysqli_num_rows($ressearch) === 0) {
echo 'Nothing Found';
}else{
while($r = $ressearch->fetch_assoc()) {
//echo results here...
}

谢谢大家:)

【讨论】:

    【解决方案3】:

    您可以在 php 脚本中使用 isset 并构建您的查询。像这样的:

    $query = "select *  search_data where";
    
    if(isset($make) && isset($model)){
       //do something
      $query .= "something you want to do ";
    }
    

    【讨论】:

    • 谢谢。我确实想过(并尝试过)这样的事情,但是访问者可以搜索的方式有很多(只有 make、make 和 location、location 和 maxprice 等等等等。也许有一种方法可以设置所有变量和从数组中创建一个字符串?
    • @FelipeFernándezSánchez 访问者可以通过多种方式进行搜索 - 有些条件需要严格比较,有些条件需要进行子字符串搜索,有些则需要或多或少的比较,有些则需要从一组中进行选择。你想用什么样的数组来保存所有这些信息?
    • 这个怎么样:如果我首先使用 if(isset($_GET['make']; $query = "make=$make" 获取所有变量然后以某种方式内爆并用 AND 爆炸?所以最终查询将是 SELECT * FROM searchdata WHERE $make ?
    • 想起来,没必要爆。我不能只用 AND 内爆吗?如果没有设置变量,那么剩下的就是从查询中删除 WHERE :S
    • 是的,就是这样!
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多