根据用户输入过滤结果

时间:2016-01-11 19:05:12

标签: php mysql

我目前正在开发一种“列表”,用户可以在其中输入不同的数据来创建各种活动的日志,特别是在模拟器中。我得到了它的基本知识,实际上完全正常运行,然而,仍然是一个组件,对我来说非常关键。这样,用户也能够搜索路线的作者。所以看看它是这样的:

名称 - 距离 - 日期

Bob - 100km - 01-01-2015

琼斯 - 200公里 - 01-01-2015

琼斯 - 250公里 - 01-01-2015

这基本上是用户会看到的列表。如果用户输入“琼斯”,他们应该只看到琼斯的结果。但是,我无法让它发挥作用。

我目前用来尝试实现“过滤器”的代码:

<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)它不会过滤掉任何内容

所以在它的基本,几乎是一个指向数据库并检查那里的记录的搜索栏中,这就是我必须带来的,这显然不起作用。

3 个答案:

答案 0 :(得分:2)

如果您正在为&#34;琼斯&#34;寻找完全匹配?或者有问题的作者,然后不要使用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); }

error reporting添加到文件的顶部,这有助于查找错误。

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);

// rest of your code

旁注:只应在暂存时进行显示错误,而不是生产。

N.B:

您目前的代码向SQL injection开放。使用prepared statementsPDOprepared statements

<强>脚注:

不确定您使用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 }

如果不这样做并且您已经有了现场网站,则可能会产生错误。

答案 1 :(得分:1)

对于问题:

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

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

第二点:

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

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

旁注:

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

答案 2 :(得分:0)

首先你需要避免sql注入,当前的方法会让你暴露于这些。这个SO post给出了一些关于如何做的好建议。

来到您的代码,我认为以下声明

    $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}%'");