我有一个php搜索查询来对我的数据库运行查询。它工作得很好,但我还没能让字段可选。为了运行搜索(截至目前),必须填写所有字段。我尝试了围绕可选搜索参数构建SQL查询的建议,但运气不太好。页面仍然加载,但我收到了无法调试的布尔错误。我还尝试了mysqli_fetch_assoc()的建议,希望参数1是mysqli_result,给定布尔值以修复我收到的布尔值错误。
这是我的原始代码,除了字段是可选的之外,它正在工作。
PHP查询-
<?php
//The File for the Database Connection
include('login/con.php');
//The SQL Query
$table = "SELECT * FROM milelog ";
if ($_SERVER['REQUEST_METHOD'] == 'POST'){
$input = mysqli_escape_string($dbconn, $_POST['location']);
$carin = mysqli_escape_string($dbconn, $_POST['Carin']);
$sdate = mysqli_escape_string($dbconn, $_POST['SDate']);
$edate = mysqli_escape_string($dbconn, $_POST['EDate']);
$miles = mysqli_escape_string($dbconn, $_POST['Miles']);
if(isset($carin)){
$table .= "WHERE Car = '$carin'";
if (isset($input))
$table .= "AND Location LIKE '%$input%'";
if (isset($sdate))
$table .= "AND Date BETWEEN '$sdate' AND '$edate'";
if (isset($miles))
$table .= "AND Miles = '$miles'";
}
}
$show = mysqli_query($dbconn, $table);
?>
这是正确显示的表格。
<table class="table">
<tr>
<td>ID</td><td>Car</td><td>Date</td><td>Location</td><td>Miles</td><td></td><td></td>
</tr>
<?php while ($row = mysqli_fetch_assoc($show)) {
echo "<tr><td>".$row['id']."</td>";
echo "<td>".$row['Car']."</td>";
echo "<td>".$row['Date']."</td>";
echo "<td>".$row['Location']."</td>";
echo "<td>".$row['Miles']."</td>";
echo "<td><a href='editentry/delete2.php?id=".$row['id']."'>Delete</a></td> <tr>";
}
?>
</table>
理想情况下,我应该能够填写这些字段的任何组合,并且仍然能够执行查询。我花了5天的时间在表格上搜索,但一直没能找到一个对我有用的成功答案。我相信答案很简单,我只是错过了一些东西。如果能指出正确的方向,我们将不胜感激。此外,如果我需要对我的问题进行更改或添加任何内容,以帮助它在社区中成为一个合理的问题,请告诉我。
从代码中唯一能弄清楚的是,串联中缺少空格
if(isset($carin)){
$table .= "WHERE Car = '$carin'";
if (isset($input))
$table .= " AND Location LIKE '%$input%'";
if (isset($sdate))
$table .= " AND Date BETWEEN '$sdate' AND '$edate'";
if (isset($miles))
$table .= " AND Miles = '$miles'";
}
下面的代码被修改以完成所需的工作用这个替换上面的代码
$flag=false;
if(isset($carin) or isset($input) or isset($sdate) or issset($miles))
$table .= "WHERE ";
if(isset($carin)){
if(!$flag)
$table .= " Car = '$carin'";
else
$table .= " AND Car = '$carin'";
$flag = true;
}
if (isset($input)){
if(!$flag)
$table .= " Location LIKE '%$input%'";
else
$table .= " AND Location LIKE '%$input%'";
$flag = true;
}
if (isset($sdate)){
if(!$flag)
$table .= " Date BETWEEN '$sdate' AND '$edate'";
else
$table .= " AND Date BETWEEN '$sdate' AND '$edate'";
$flag = true;
}
if (isset($miles)){
if(!$flag)
$table .= " Miles = '$miles'";
else
$table .= " AND Miles = '$miles'";
$flag = true;
}
我认为问题是isset将在字符串"上返回true;
$var = '';
if(isset($var)){
echo 'True'; // This is the expected behavior
}
你应该使用的是空的。
举个例子:
if(!empty($carin))
$table .= "WHERE Car = '$carin'";
此外,考虑到您有多个情况,您将希望在连接查询中的每个"AND"之前放置一个空格。
一个更简单的方法可能是将可选项推送到数组中,然后内爆数组以获得正确的连接查询。
例如,如果$carin是空的,而$input不是空的,那么您将得到一个没有WHERE的查询,但它是期望的
所以,也许可以这样做。
$terms = array();
if(!empty($carin)){
array_push($terms, " Car = ".$carin);
}
if(!empty($input)){
array_push($terms, " Location LIKE '%".$input."%');
}
....
然后,在为所有其他术语做了这些之后:
if(count($terms) > 0){
$table .= $table.' WHERE '.implode(' AND ', $terms);
}