Php 通过选择标记筛选的简单搜索

Php 通过选择标记筛选的简单搜索,php,mysql,sql,search,filter,Php,Mysql,Sql,Search,Filter,在这里,我试图通过select标记值进行搜索查询筛选。我应该在代码中编辑什么更正 我尝试了很多方法,但我没有发现代码有任何问题 <label>Filter by:</label> <select name="select"> <option value = "fullname">Name</option> <option value = "username">U

在这里,我试图通过select标记值进行搜索查询筛选。我应该在代码中编辑什么更正

我尝试了很多方法,但我没有发现代码有任何问题

<label>Filter by:</label>
        <select name="select">
            <option value = "fullname">Name</option>
            <option value = "username">Username</option>
        </select>
            <input type="text" name="keywords" style="width:20%" placeholder="Search...">
            <input style="width:3%" type="submit" name="search" value="GO"/>
        </div>
        <br />
        <?php       


        if (isset($_POST["search"])){
            $select = $_POST['select'];
            $keywords = $_POST['keywords'];
            if ($query = mysqli_query($con,"SELECT * from users WHERE '%{$select}%' LIKE '%{$keywords}%' ")) {

                    while ($rows = mysqli_fetch_assoc($query)) {
                            echo "<tr>".
                                  "<td>".$rows['fullname']."</td>".
                                  "<td>".$rows['username']."</td>".
                              "</tr>";              
                    }                       
            }


        } else {
            echo "No results to display!";
            echo "<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />";
    }
        ?>
过滤方式:
名称
用户名


好吧,有很多事情我可以评论

$select = $_POST['select'];
$keywords = $_POST['keywords'];
if ($query = mysqli_query($con,"SELECT * from users WHERE '%{$select}%' LIKE '%{$keywords}%' ")) {
使用
LIKE
谓词只接受右侧操作数上的通配符。因此,您不需要左边的
%
通配符

我假设您的表单选项“全名”和“用户名”应该是列名。但是在左侧操作数“$select”
周围使用单引号将其视为字符串,而不是列名。单引号用于SQL中的字符串或日期文字,而不是列名或表名等标识符

所以现在我们应该看到:

$select = $_POST['select'];
$keywords = $_POST['keywords'];
if ($query = mysqli_query($con,"SELECT * from users WHERE {$select} LIKE '%{$keywords}%' ")) {
但是这里有一个安全问题,因为您无法知道
$\u POST['select']
将始终是合法的列名。对于某些人来说,发送一个POST变量(它不是表单中的选项之一)很容易造成麻烦。当您将表单输入直接复制到SQL查询中时,这是攻击者攻击您的站点的一个安全向量,因为他们可以操纵您的SQL来做您不想做的事情

相反,对值使用查询参数,对标识符使用白名单

switch ($_POST['select']) {
case 'fullname':
  $select = 'fullname'; break;
case 'username':
  $select = 'username'; break;
default:
  trigger_error("Not a valid choice to search");
  die();
}
$keywords = "%{$_POST['keywords']}%";
if ($query = mysqli_prepare($con,"SELECT * from users WHERE {$select} LIKE ?")) {
  $query->bind_param("s", $keywords);
  if ($query->execute()) {
    $result = $query->get_result();
    ...loop over result...
  } 

@mickmackusa,Stack Overflow应该在每个贴有“sql”和“php”标记的帖子中添加该注释。误报率很小,可以忽略不计。1-使用。2-检查你的问题。或者用类似的方式敲打:结束或否决这个问题并不能帮助OP了解发生了什么。