提问人:zth_codes 提问时间:4/18/2023 更新时间:4/18/2023 访问量:46
从MySQL数据库填充的PHP下拉列表不会对PHP查询进行POST选择
PHP dropdown populated from MySQL database won't POST selection to PHP query
问:
场景:
我正在用MySQL数据库中的数据填充下拉菜单。单击“提交”按钮后,脚本应将用户带到结果页面,并根据他们的选择显示数据。
问题:
用户选择无法 POST 到下一页进行查询。当我硬编码与其中一个下拉选项匹配的选项时,查询工作正常。
-- 这是下拉菜单 --
<div class = "servicelinesearchbox">
<div class="servicelinesearchbar">
<form class="form-inline" method="post" action="search_by_service_line.php">
<select name="service_lines" id ="service_lines" form="service_line_form">
<option value = "">---SELECT A SERVICE LINE---</option>
// THIS OPTION ADDED FOR TESTING, DOES WORK AND POPULATE DATA ON NEXT PAGE --
<option value = "Architectural">Architectural</option>
<?php
$sql = "SELECT service_lines FROM service_lines ORDER BY service_lines";
$db = mysqli_query($conn, $sql);
while ( $d=mysqli_fetch_assoc($db)) {
echo "<option value='{".$d['service_lines']."}'>".$d['service_lines']."</option>";
}
?>
</select>
<button type="submit" name="save" class="btn btn-primary">SEARCH</button>
</form>
</div>
</div>
-- 这是结果页中使用 POST 数据运行查询的部分 --
<?php
include "config.php";
if (isset($_POST["save"])> 0) {
$service_lines = htmlspecialchars($_POST['service_lines']);
$sql = "SELECT * FROM subconsultants WHERE service_lines LIKE '$service_lines'";
$result = mysqli_query($conn, $sql);
}
?>
答:
0赞
Pippo
4/18/2023
#1
根据 @zth_codes 的要求添加了更多信息
在行中:
echo "<option value='{".$d['service_lines']."}'>".$d['service_lines']."</option>";
不需要大括号:取下它们
在行中:
$sql = "SELECT * FROM subconsultants WHERE service_lines LIKE '$service_lines'";
必须添加才能让 LIKE 运算符工作:%
LIKE '%$service_lines%'
使用参数而不是字符串连接将阻止 SQL 注入
在查询中使用预准备语句和参数的示例以及进一步的建议
带有参数的预准备语句的可能示例如下:
<?php
include 'config.php';
if (isset($_POST['save'])) {
$sql = 'SELECT * FROM subconsultants WHERE service_lines = ?';
$stmt = mysqli_stmt_init($conn);
mysqli_stmt_prepare($stmt, $sql);
mysqli_stmt_bind_param($stmt, 's', $_POST['service_lines']);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$row = $result->fetch_array();
}
它有点冗长,但避免了 SQL 注入。
我还用查询中的运算符替换了运算符,因为在我看来不需要部分搜索:这样您还将从搜索列上的任何索引中受益LIKE
=
另一个提示:除非必要,否则不要在字符串中使用双引号:双引号总是使字符串经过特殊的字符处理和变量扩展。
最后,如果 PHP 文件中没有其他 HTML 行,我建议不要关闭带有标签的 PHP 代码:标签后代码中的任何空行和不可见行都会被解释为(不需要的)HTML 行?>
?>
评论
0赞
zth_codes
4/18/2023
取下大括号解决了这个问题。你能给我一个如何使用参数而不是字符串串联的例子吗?我是PHP的新手,我主要做后端编码,但不得不为工作创建这个工具,因为我是目前唯一的开发人员。
0赞
Pippo
4/18/2023
@zth_codes 我根据要求在回答中添加了一个示例和进一步的建议
0赞
zth_codes
4/19/2023
谢谢。另外,我今天刚去继续研究这个,现在它不再起作用了?它告诉我这一行未定义的数组键:$service_lines = htmlspecialchars($_POST['service_lines']);但是昨天它起作用了吗?
0赞
Pippo
4/19/2023
@zth_codes - 是否更改了选择输入的名称?- 您是否在选择的输入中添加了至少一个选项?- 同时从选择输入中删除表单属性。(如果您使用带有参数的预准备语句,则不再需要将 htmlspecialchars() 应用于您的输入)
0赞
zth_codes
4/19/2023
我删除了 form 属性并修复了它,非常感谢您的帮助!
评论
View Source
{}
value='{".$d['service_lines']."}'
value = "Architectural"