如何根据用户选择的下拉菜单更改 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 查询的主要内容,如果未能解决你的问题,请参考以下文章