可选查询字段和所需查询字段的PHP差异

时间:2015-12-28 21:12:53

标签: php html search mysqli

我有一个php搜索查询来在我的数据库上运行查询。它工作得很好,但我无法使字段可选。为了运行搜索(截至目前),必须填写所有字段。我已经尝试了Constructing an SQL query around optional search parameters的建议而没有太多运气。页面仍然加载,但我收到布尔错误,我无法调试。我也尝试了mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given的建议来修复我收到的布尔错误。

这是我的原始代码,除了字段是可选的外。

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天时间搜索表单,但未能找到对我有用的成功答案。我确定答案很简单,而我刚刚失踪了。我们将非常感谢正确方向上的一点。另外,请告诉我是否需要更改或添加任何内容以帮助我在社区中提出合理的问题。

2 个答案:

答案 0 :(得分:1)

唯一能从代码中弄清楚的是连接中缺少空格

 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;
}

答案 1 :(得分:0)

我认为问题是isset会在一串&#39;&#39;;

上返回true
$var = '';
if(isset($var)){
    echo 'True'; // This is the expected behavior
}

你应该使用的是空的。

上面的示例:

if(!empty($carin))
    $table .= "WHERE Car = '$carin'";

另外,考虑到你拥有的多个案例,你会想要在每个案例之前留出一个空格&#34; AND&#34;在您的连锁查询中。

更简单的方法可能是将可选项推送到数组中,然后内爆数组以获得正确连接的查询。

例如,如果$ 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);
}