【问题标题】:Simple Search filtered by select tag按选择标签的简单搜索过滤器
【发布时间】:2019-06-16 10:46:56
【问题描述】:

在这里,我试图通过选择标记值过滤搜索查询。我应该在我的代码中编辑什么更正?

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

<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 />";
    }
        ?>

我希望根据选择标签显示结果。当我提交表单时,它什么也没显示。

【问题讨论】:

  • @mickmackusa,Stack Overflow 应该将该评论添加到每个带有“sql”和“php”标签的帖子中。误报率足够小,可以忽略。
  • 2 件事。 1- 使用parametrized queries。 2-检查您的查询for errors
  • 或者用类似锤子的东西:stackoverflow.com/questions/17053466/…
  • 关闭或否决这个问题并不能帮助 OP 了解发生了什么。

标签: php mysql sql search filter


【解决方案1】:

好的,我可以评论很多事情。

$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}%' ")) {

但是这里有一个安全问题,因为你不知道$_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...
  } 

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 2023-04-06
    • 2013-01-03
    • 2013-06-03
    • 2019-07-27
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多