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


PHP difference for optional query fields and required query fields

我有一个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);
}