使用过滤下拉列表中选择搜索

问题描述 投票:0回答:2

我写了这个代码,并筛选使用选择下拉菜单中的搜索。我有一个搜索框,但我的问题是:如果我把东西在搜索框中,它不显示,即使我搜索存在于数据库中的数据什么。

下拉工作,但如果我尝试选择在这三个选择(当然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">

他们是在同一个文件顺便说一句,在此先感谢

php html
2个回答
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代码。


1
投票

至于你问“或者”

or section = '$section' 

不符合$部分的记录将被显示。如果你不想要的,你必须使用一个“和”

热门问题
推荐问题
最新问题