我目前正在开发一种“列表”,用户可以在其中输入不同的数据来创建各种活动的日志,特别是在模拟器中。我得到了它的基本知识,实际上完全正常运行,然而,仍然是一个组件,对我来说非常关键。这样,用户也能够搜索路线的作者。所以看看它是这样的:
名称 - 距离 - 日期
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)它不会过滤掉任何内容
所以在它的基本,几乎是一个指向数据库并检查那里的记录的搜索栏中,这就是我必须带来的,这显然不起作用。
答案 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 statements或PDO与prepared 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}%'");