从MySQL数据库填充的PHP下拉列表不会对PHP查询进行POST选择

PHP dropdown populated from MySQL database won't POST selection to PHP query

提问人:zth_codes 提问时间:4/18/2023 更新时间:4/18/2023 访问量:46

问:

场景:

我正在用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);
}
?>
php jquery mysql 发布 mysqli

评论

1赞 Barmar 4/18/2023
您的脚本容易受到 SQL 注入攻击。即使你正在逃避变量,它也不安全!您应该始终在 MYSQLI 或 PDO 中使用预准备语句和参数化查询,而不是将变量连接到查询中。
1赞 David 4/18/2023
“用户选择无法 POST 到下一页进行查询。”- 您能否澄清一下您正在进行的具体调试观察,特别是失败的原因?表格根本没有发布吗?它是否已发布,但未达到您期望的值?它是否发布了预期值,但服务器端代码中的某些内容未按预期工作?别的?
1赞 Barmar 4/18/2023
你看到菜单中的选项了吗?如果没有,当你看到它们时,你会看到它们吗?View Source
0赞 Barmar 4/18/2023
你为什么要把这些价值观放在一起?{}value='{".$d['service_lines']."}'
0赞 Barmar 4/18/2023
你没有那些卷曲的大括号,所以我认为这就是它有效而动态大括号没有的原因。摆脱他们。value = "Architectural"

答:

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 属性并修复了它,非常感谢您的帮助!