【问题标题】:PHP difference for optional query fields and required query fields可选查询字段和必填查询字段的 PHP 区别
【发布时间】:2015-12-28 21:12:52
【问题描述】:

我有一个 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 天时间搜索表格,但未能找到对我有用的成功答案。我确定答案很简单,而且我刚刚错过了一些东西。一个正确方向的点将不胜感激。另外,如果我需要对我的问题进行更改或添加任何内容,请告诉我,以帮助它在社区中成为一个合理的问题。

【问题讨论】:

    标签: php html search mysqli


    【解决方案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;
    }
    

    【讨论】:

    • 太棒了!几乎完全解决了我的问题。现在,我唯一仍然需要可选的是 Car 字段。我怎样才能让汽车字段仍然是可选的,所以不必选择它?
    • 我修改了一些代码,需要用原来的@MatthewDavis替换
    • 甜蜜!我的脚本正在运行。我仍然不得不修改你对我的游戏,但它奏效了。我现在很乐意接受这个答案。如果你不介意的话,我还有一个简短的问题要问你。我将开始日期和结束日期设置为 $sdate 和 $edate。在我的数据库中,我有一列名为 date。这些变量使我可以在日期范围之间进行搜索。是否可以这样做,如果只设置了开始日期,我仍然可以运行查询,但如果两者都设置了,仍然可以在日期之间搜索?
    • 我不认为在你的情况下只有开始日期是可能的,但如果结束日期没有过去,它可以设置为默认日期...
    • 好的。谢谢。现在,我可以对它的位置感到满意。将来当我推出我的程序的 v.2 时,我会对此进行研究。
    【解决方案2】:

    我认为问题在于 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);
    }
    

    【讨论】:

    • 感谢您的回答。现在将尝试一下。有了数组,我还会以同样的方式在我的表中调用它吗?
    • 这很有趣..不管我怎么做,这条线都有问题。即使我为您复制和粘贴原件,它甚至都不会以颜色编码。 if(!empty($sdate)){ array_push($terms, " Date BETWEEN '$sdate' AND '$edate'); 我得到的错误是第 36 行的意外日期 @P.Gearman
    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2013-07-06
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多