根据用户输入筛选结果


Filter results based on user input

我目前正在开发一种"列表",用户可以在其中输入不同的数据,为各种活动创建一种日志,特别是在模拟器中。我已经把它的基础知识放好了,事实上已经完全启动并运行了,然而,还有一个组件对我来说相当关键。那就是,用户还可以搜索路线的作者。所以这样看:

名称-距离-日期

Bob-100km-2015年1月1日

Jones-200km-2015年1月1日

Jones-250公里-2015年1月1日

这基本上就是用户会看到的列表。如果用户输入"Jones",他们应该只看到Jones的结果。然而,我无法让它发挥作用。

我目前正在使用的代码试图实现"过滤器":

<div class="filters">
        <ul>
            <li>
                <form method="POST" action="index.php?category=trucking">
                    <input type="text" name="filterName" />
                    <input type="submit" name="submit" label="Search for Author" />
                </form>
            </li>
            <li>
                <a href="index.php?category=addEntryFT"><b>Add a entry</b></a>
            </li>
        </ul>
    </div>
    <div class="results">
        <?php
            // Get from database
                      if(isset($_POST['submit'])) {
                      $filterName = $_POST['filterName'];
                      $result = mysqli_query($anslutning, "SELECT * FROM tblLogs WHERE category = 'trucking' AND author LIKE '$filterName'");
                        }
        ?>

因此,首先我创建了一个表单,用户在其中输入一个作者,无论他们输入什么,都应该应用。两个问题:

1) 该表单使页面重定向到上一页,并且2)它不会过滤掉任何

因此,在它的基本功能中,几乎是一个搜索栏,指向数据库并检查那里的记录,这就是我所要做的,显然不起作用。

对于ist问题:

在表单字段中使用空操作,因为您的所有代码都可以在一个文件中使用,如:

<form method="post" action="">

对于第二点:

您需要为匹配字符串添加%符号,如:

$result = mysqli_query($anslutning, "SELECT * FROM tblLogs WHERE category = 'trucking' AND author LIKE '%$filterName%'"); 

旁注:

如果您还想将类别用作表单字段,则可以使用类别的隐藏表单输入。

如果你正在寻找"Jones"或有问题的作者的精确匹配,那么不要使用LIKE,使用=

WHERE category = 'trucking' AND author = '$filterName'

然后对结果进行迭代。

旁注:根据您想在此处使用的内容,您可以使用mysqli_fetch_assoc()mysli_fetch_array()

另一个注意事项:确保输入中不包含空格。使用trim()对付它。

此外,还可以使用添加到查询中的GROUP BY col和可能的ORDER by col

while($row = mysqli_fetch_assoc($result)){
    echo $row['the_row_you_want_to_show'];
    echo "<br>";
    echo $row['the_OTHER_row_you_want_to_show'];
    // etc.
}

使用mysqli_error($anslutning)检查查询中的错误。

即:if(!result) { echo "Error: " . mysqli_error($anslutning); }

错误报告添加到文件顶部,这将有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code

旁注:显示错误只能在暂存中进行,而不能在生产中进行。


N.B.:

您当前的代码对SQL注入是开放的。将准备好的语句PDO已准备好的报表一起使用。


脚注:

不确定为什么要使用action="index.php?category=trucking",因为这意味着要使用GET方法,如果在代码中没有显示的地方使用,则需要详细说明。

如果您没有使用它,那么只需移除?category=trucking即可。

一个例子是,如果你打算保持行动的方式:

$cat = $_GET['category'];
// $cat = $_REQUEST['trucking']; // or $_REQUEST

并将其作为在查询中使用

WHERE category = '$cat' AND author = '$filterName'

另外,最好检查您的输入是否为空,因此使用条件!empty()来对抗它

if(!empty($_POST['filterName'])){ do something }

如果不这样做,并且你已经有了一个实时网站,那么它可能会产生错误。

首先,您需要避免sql注入,当前的方法会让您面临这些问题。这篇SO文章给出了一些关于如何的好建议。

来到你的代码,我认为下面的声明

    $result = mysqli_query($anslutning, "SELECT * FROM tblLogs WHERE category = 'trucking' AND author LIKE '$filterName'");

需要更改,以便为作者名称加前缀/后缀,或者两者都加,如下面的

    $result = mysqli_query($anslutning, "SELECT * FROM tblLogs WHERE category = 'trucking' AND author LIKE '%{$filter_name}%'");