【问题标题】:Filter using PHP and MYSQL使用 PHP 和 MYSQL 进行过滤
【发布时间】:2018-03-11 19:44:00
【问题描述】:

我是一名编程爱好者,正在从事我的一个小项目,但是当我想为我的 mysql 输出制作过滤器时遇到了困难。

当我填写所有搜索输入字段并提交时,一切正常,出现正确的过滤结果。但是当我离开一个字段时,没有任何显示(只有 else 命令)使用 AND 条件。如果我使用 OR 并将其留空,它会显示所有结果,而不关心必填字段中填写的内容。

即使其中一个字段为空,是否有任何方法可以显示结果?我尝试在stackoverflow中使用来自不同帖子的代码,但还没有运气,因为我没有太多经验,无法弄清楚如何在我的代码中使用它。

if(isset($_POST["profilename"]) && $_POST["profilename"] != "") 
$sql .= " AND profilename = '". $_POST["profilename"] ."'";

以下是我的代码,如果您可以查看并建议我可以编辑的内容,以便过滤正常工作。

<select class="form-control" id="Select1" name="departure">
<select class="form-control" id="Select2" name="destination">
<select class="form-control" id="Select3" name="layover">

...

<?php
include_once("connect.php");

if (isset($_GET['submit'])) {
$departure = mysqli_real_escape_string($connection, $_GET['departure']);
$destination = mysqli_real_escape_string($connection, $_GET['destination']);
$layover = mysqli_real_escape_string($connection, $_GET['layover']);



$result = mysqli_query($connection, "SELECT * FROM crud 
WHERE departure LIKE '$departure%' 
AND kam LIKE '$kam' 
AND layover LIKE '$layover'
ORDER BY id DESC");



if($make = mysqli_num_rows($result) > 0){
while($r = mysqli_fetch_assoc($result)){
echo '<div style="display:block;"'.$r['departure'].'</div>';
echo '<div style="display:block;"'.$r['kam'].'</div>';
echo '<div style="display:block;"'.$r['layover'].'</div>';
//following code..
}
}else{
echo'<h4>No match found!</h4>';

print ($make);
}
mysqli_free_result($result);
mysqli_close($connection);
}

?>

例如:使用Destination 过滤Departure 并将Layover 留空 -> 应返回所需的Departure and Destination 和任何Layover 的结果。 或第二个示例:用Layover 填充Destination,但将Departure 留空将导致使用任何Departure 搜索Destination and Layover。

请让我知道我的代码是否可行以及可能的方式。 非常感谢你们!!

【问题讨论】:

    标签: php mysql search mysqli filter


    【解决方案1】:

    您可以根据每个不同 AND 条件中的 OR 条件中的空字符串检查每个输入。

    "SELECT * FROM crud
    WHERE ('$departure' = '' OR departure LIKE '$departure%')
    AND ('$kam' = '' OR kam LIKE '$kam')
    AND ('$layover' = '' OR layover LIKE '$layover')
    ORDER BY id DESC"
    

    这样,如果没有给出其中一个输入参数,则条件的相应部分将被解释为,例如,('' = '' OR departure LIKE '$departure%'),因为'' 始终等于@987654324,所以每一行都将评估为真@ 不考虑 LIKE 比较。

    几个注意事项 - 首先,没有任何通配符,您的 LIKE 比较基本上像 = 一样工作(例如,kam LIKE '$kam' 将匹配与 kam = '$kam' 相同的行)。因此,要么只使用 =,要么添加一些通配符以使它们有用。

    其次,考虑使用准备好的语句,而不是像这样将值连接到 SQL 中。连接方法使您的代码容易受到 SQL 注入和各种烦人的错误的影响(即使您转义了字符串)。

    【讨论】:

    • 完美,效果很好,解决方案也很简单! :) 还会有任何具体建议在我的代码中进行哪些更改,以便它不易受到 sql 注入的影响?我不确定我可以改变什么来防止这种情况发生。非常感谢!
    【解决方案2】:

    类似这样的:

    $result = mysqli_query($connection, "SELECT * FROM crud 
    WHERE (departure LIKE '$departure%' OR departure is null)
    AND kam LIKE '$kam' 
    AND (layover LIKE '$layover' OR departure is null)
    ORDER BY id DESC");
    

    【讨论】:

      【解决方案3】:

      让我们把“不要使用用户输入构建查询”放在一边。

      如果你想走这条路,你可以使用条件来逐步构建查询。

      $query = "SELECT * FROM crud WHERE ";
      if (!empty($departure)) {
        $query .= "departure LIKE '$departure%' AND ";
      }
      if (!empty($destination)) {
        $query .= "destination LIKE '$destination%' AND ";
      }
      if (!empty($layover)) {
        $query .= "layover LIKE '$layover' AND ";
      }
      $query .= "1 ORDER BY id DESC";
      

      您最终会在 $query 字符串中找到一些替代方案:

      NOTHING SELECTED:
      SELECT * FROM crud WHERE 1 ORDER BY id DESC
      
      SOMETHING SELECTED:
      SELECT * FROM crud WHERE departure LIKE '$departure%' AND layover LIKE '$layover' AND 1 ORDER BY id DESC
      
      ALL SELECTED:
      SELECT * FROM crud WHERE departure LIKE '$departure%' AND destination LIKE '$destination%' AND layover LIKE '$layover' AND 1 ORDER BY id DESC
      

      这应该涵盖它。 祝你有美好的一天

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 2010-12-11
        • 2017-06-18
        • 2012-01-22
        • 1970-01-01
        • 2010-11-01
        • 2021-01-06
        相关资源
        最近更新 更多