我写了这个代码,并筛选使用选择下拉菜单中的搜索。我有一个搜索框,但我的问题是:如果我把东西在搜索框中,它不显示,即使我搜索存在于数据库中的数据什么。
下拉工作,但如果我尝试选择在这三个选择(当然Grade12,ICT,A)的3个选项,它会显示我已经在第12级,和ICT但B中的记录。我没有,有一个关于它的任何数据,所以我希望它什么都不显示,因为A是不存在的,但它表明,有不同的部分(A是一款BTW)数据
<div class = "records">
<table width ="600" border = "1" cellpadding ="1" cellspacing ="1">
<tr>
<th>Last Name</th>
<th>First Name</th>
<th>Middle Name</th>
<th>Grade</th>
<th>Strand</th>
<th>Section</th>
</tr>
<?php
if (isset($_POST['search'])) {
$box = $_POST['box'];
$box = preg_replace("#[^0-9a-z]#i","",$box);
$grade =$_POST['grade'];
$strand = $_POST['strand'];
$section = $_POST['section'];
$sql = "SELECT * FROM student WHERE grade ='$grade' or track ='$strand' or section = '$section' or fname ='%$box%'";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_assoc($result))
{
echo "<tr>";
echo "<td>".$row['lname']."</td>";
echo "<td>".$row['fname']."</td>";
echo "<td>".$row['mname']."</td>";
echo "<td>".$row['grade']."</td>";
echo "<td>".$row['track']."</td>";
echo "<td>".$row['section']."</td>";
echo "</tr>";
}
}
else {
}
?>
然后前端
link rel = "stylesheet" href ="style.css">
<body>
<form action ="../pages/section.php" method="POST" >
<div class = "view">
<input type = "text" name="box" placeholder = "search here">
<label class = grade2></label>
<select class = "grade" name = "grade">
<option value ="" >=====Grade=====</option>
<option value ="Grade11">Grade 11</option>
<option value ="Grade12">Grade 12</option>
</select>
<select class = "strand" name = "strand">
<option >=====Strand=====</option>
<option value ="GAS">GAS</option>
<option value ="ICT">ICT</option>
<option value ="STEM">STEM</option>
<option value ="HUMSS">HUMMSS</option>
<option value ="ABM">ABM</option>
</select>
<select class = "section" name = "section">
<option value ="1">=====Section=====</option>
<option value ="A">A</option>
<option value ="B">B</option>
<option value ="C">C</option>
<option value ="D">D</option>
<option value ="E">E</option>
</select>
<input type="submit" name="search" value= "Submit">
他们是在同一个文件顺便说一句,在此先感谢
让我们假设$box = "foo"
当在查询WHERE fname ='%$box%'
这样做,它会逐字搜索字符串%foo%
。
如果你想使用通配符,你必须使用LIKE
操盘=
的。 WHERE fname LIKE '%$box%'
将搜索包含字符串foo
在那旁边,查询全方位开放SQL Injections。考虑使用prepared statements
要卸下不在$_POST['box']
字母数字但这是远远不够的字符。 (这是非常糟糕的,你不能搜索"Obi Wan"
或"Obi-Wan"
,这将相当搜索"ObiWan"
)
没有什么可以阻止用户按下F12键,更改下拉值注入SQL代码。
至于你问“或者”
or section = '$section'
不符合$部分的记录将被显示。如果你不想要的,你必须使用一个“和”