我编写了这段代码,它使用选择下拉列表过滤了搜索。我有一个搜索框,但是我的问题是:如果我在搜索框中放了东西,即使我搜索了数据库中存在的数据,它也不会显示任何内容。
该下拉列表正在运行,但是如果我尝试在这三个选项(例如12级,ICT,A)中选择3个选项,它将在该部分向我显示具有12级,ICT但为B的记录。我没有任何带有A的数据,所以我希望它不显示任何内容,因为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">
顺便说一句,它们在同一个文件中
答案 0 :(得分:1)
您要求输入“或”
or section = '$section'
将显示与$ section不匹配的记录。 如果不想,则必须使用“和”
答案 1 :(得分:0)
让我们假设$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代码。