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

时间:2019-02-05 09:41:27

标签: php html

我编写了这段代码,它使用选择下拉列表过滤了搜索。我有一个搜索框,但是我的问题是:如果我在搜索框中放了东西,即使我搜索了数据库中存在的数据,它也不会显示任何内容。

该下拉列表正在运行,但是如果我尝试在这三个选项(例如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">

顺便说一句,它们在同一个文件中

2 个答案:

答案 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代码。