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