如何根据用户选择的下拉菜单更改 PHP 中的 SQL 查询

Posted

技术标签:

【中文标题】如何根据用户选择的下拉菜单更改 PHP 中的 SQL 查询【英文标题】:How to change SQL query in PHP in relation to what drop down menus the user selects 【发布时间】:2017-05-10 13:02:27 【问题描述】:

我目前正在学校做一个项目,其中涉及使用表单来查询数据库。此表单有多个下拉菜单,如果用户未填写所有下拉菜单,我不确定如何查询数据库。例如,如果用户只想搜索某个职位类型而没有指定行业。

索引.html

<html>
    <head>
    </head>
    <body>
        <form action="test.php" method="post">
            <select name="varjobtype">
                <option value="nullg" disabled selected hidden>Job Type</option>
                <option value="Part Time">Part Time</option>
                <option value="Full Time">Full Time</option>	
                <option value="Contract">Contract</option>
                <option value="Temporary">Temporary</option>
            </select>
            <select name="varindustry">
                <option value="null" disabled selected hidden>Industry</option>
                <option value="Accommodation and Food Services">Accommodation and Food Services</option>
                <option value="Retail">Retail</option>
            </select>
        </form>
    </body>
</html>

测试.PHP

<html>
    <head>
    </head>
    <body>
        <?php 
        $jobtype = $_POST['varjobtype'];
        $industry = $_POST['varindustry'];

        $sql = "SELECT `Job ID`, Name, Employer FROM JobListings WHERE `Job Type`  = '$jobtype' AND `Industry` = '$industry' ";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) 
            while($row = $result->fetch_assoc()) 
        ?>
                <div id="<? echo $row['Job ID']; ?>" class="box">
                <?
    	        echo "Job ID: " . $row["Job ID"]. "<br>";     
                echo "Name: " . $row["Name"]. "<br>"; 
                echo "Employer: " . $row["Employer"]. "<br>";
        	    echo "</div>";
            
        ?>            
        <?
         else 
            echo "0 results";
        
        $conn->close();
    ?>
    </body>
</html>

到目前为止,php 没有输出任何结果。即使用户选择其中一个下拉菜单,SQL 语句仍将显示作业,您将如何做到这一点。如果用户不与任何下拉菜单交互,是否可以使其显示所有作业?

【问题讨论】:

您可以尝试将默认选定字段的值替换为“%”。然后在您的查询中,您应该将 WHERE 子句中的“=”替换为“LIKE”。然后,默认值将充当通配符。 ***.com/a/804405/5884874 警告:当使用mysqli 时,您应该使用parameterized queries 和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了严重的SQL injection bug。 切勿$_POST$_GET 数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 【参考方案1】:

试试这个:

$jobtype = isset($_POST['varjobtype']) ? $_POST['varjobtype'] : '';
$industry = isset($_POST['varindustry']) ? $_POST['varindustry'] :'';

$sql = "SELECT `Job ID`, Name, Employer FROM JobListings";

$where = array();

if ($jobtype) $where[] = "`Job Type`  = '".$jobtype."'";

if ($industry ) $where[] = "`Industry` = '".$industry."'";

if (!empty($where)) 
     $sql .= " where " . implode (" and ",$where);


$result = $conn->query($sql);
...

【讨论】:

提示:在 PHP 7 中,可以使用 null coalescence operator 清理前两行代码。 第 12 行出现此错误“Parse error: syntax error, unexpected ')'”? @matthew6543 编辑:if (!empty($where)) 你不能只在原始变量上implode 并将它们注入到查询中。这会创建一个巨大的SQL injection hole。 问题不在于 sql 注入、内爆或他写的内容($sql = "SELECT Job ID, Name, Employer FROM JobListings WHERE Job Type = '$jobtype' AND Industry = '$industry' ";) 是同样的东西,不能阻止 sql 注入。还有其他线程讨论这个,例如this thread

以上是关于如何根据用户选择的下拉菜单更改 PHP 中的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

根据使用 php 和 jquery 的下拉选择更改价格变量

如何检查 iframe 中的选择下拉菜单是不是更改?

php和javascript中的下拉框

想从下拉列表中选择选项并根据所选选项更改按钮的标题...如何?

如何创建基于另一个下拉菜单的答案出现的下拉菜单

如何根据另一个下拉菜单值禁用下拉菜单