You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纯PHP/MySQL实现文本搜索+性别下拉筛选数据库记录方案

PHP+MySQL多条件搜索(文本+性别筛选)修复方案

你现有代码无法实现性别筛选的核心问题共3处:

  • 后端逻辑未接收表单提交的gender下拉参数,SQL查询语句也没有写入性别匹配规则
  • 性别下拉框缺失选中状态保留逻辑,表单提交后选项会重置为默认提示
  • 原SQL直接拼接用户输入存在SQL注入风险,且ORDER BY子句错误用单引号包裹字段名,会导致排序功能完全失效

修改逻辑说明

后续要新增其他筛选项(比如年龄段、发布时间范围等)都可以按这个规则扩展:

  1. 先初始化查询条件容器,所有用户传入的筛选参数先做合法性校验
  2. 文本搜索框有输入时,追加模糊匹配条件
  3. 性别下拉框选了有效值(非默认空提示)时,追加性别精确匹配条件
  4. 用预处理语句执行SQL,避免恶意输入破坏数据库
  5. 表单控件加选中/值保留逻辑,提交后用户之前选的内容不会消失

修复后完整代码

<?php 
    include("header.php");
    include("config.php");

    // 初始化筛选参数
    $search = isset($_GET['search']) ? trim($_GET['search']) : '';
    $selected_gender = isset($_GET['gender']) ? trim($_GET['gender']) : '';
    
    // 动态拼接查询条件
    $where_clauses = [];
    $bind_params = [];
    $param_types = '';
    $query_run = null;

    // 表单提交后才执行查询
    if (isset($_GET['search']) || isset($_GET['gender'])) {
        // 文本搜索条件:有输入时才生效
        if ($search !== '') {
            $where_clauses[] = "CONCAT(First_Name, Last_Name, Gender, Message, Message_Date, Email) LIKE ?";
            $bind_params[] = "%{$search}%";
            $param_types .= 's';
        }

        // 性别筛选条件:选了非默认选项时才生效
        $allowed_gender = ['male', 'female', 'other'];
        if (in_array($selected_gender, $allowed_gender)) {
            $where_clauses[] = "Gender = ?";
            $bind_params[] = $selected_gender;
            $param_types .= 's';
        }

        // 拼接最终SQL
        $sql = "SELECT * FROM uc_messages";
        if (!empty($where_clauses)) {
            $sql .= " WHERE " . implode(' AND ', $where_clauses);
        }
        // 修正原ORDER BY的语法错误:字段名不能用单引号包裹
        $sql .= " ORDER BY `Last_Name` ASC";

        // 预处理执行查询(防SQL注入)
        $stmt = mysqli_prepare($dbconnect, $sql);
        if (!empty($bind_params)) {
            mysqli_stmt_bind_param($stmt, $param_types, ...$bind_params);
        }
        mysqli_stmt_execute($stmt);
        $query_run = mysqli_stmt_get_result($stmt);
    }
?>
    

<section id="make_search">
    <div class="search">
        <form action="" method="GET">
            <input type="text" name="search" value="<?php echo htmlspecialchars($search); // 转义输出防XSS ?>" class="search_bar" placeholder="Search Records">
            <!-- 补全name和id之间缺失的空格 -->
            <select name="gender" id="dropdown">
                <option value="" <?php echo $selected_gender === '' ? 'selected' : ''; ?> disabled>Gender</option>
                <option value="male" <?php echo $selected_gender === 'male' ? 'selected' : ''; ?>>Male</option>
                <option value="female" <?php echo $selected_gender === 'female' ? 'selected' : ''; ?>>Female</option>
                <option value="other" <?php echo $selected_gender === 'other' ? 'selected' : ''; ?>>Other</option>
            </select>
            <button type="submit" class="button">Search</button>
        </form>
    </div>
</section>


<section id="show_records">
        <div class="results">   
            <?php 
            // 未提交表单时显示初始提示
            if (!$query_run && !isset($_GET['search']) && !isset($_GET['gender'])) { 
            ?>
                <h2>Click search to view all results.</h2>
            <?php } elseif (!$query_run) { // 查询执行出错 ?>
                <h2>查询出错,请稍后重试</h2>
            <?php } elseif (mysqli_num_rows($query_run) == 0) { // 无匹配结果 ?>
                <h2>没有找到符合条件的记录</h2>
            <?php } else { // 正常输出结果表格 ?>
                <table class="table">
                        <thead>
                            <th>Firstname</th>
                            <th>Lastname</th>
                            <th>Gender</th>
                            <th>Message</th>
                            <th>Date</th>
                            <th>Email</th>
                        </thead>
                        <tbody>
                            <?php foreach($query_run as $row) { ?>
                                <tr>
                                <td><?php echo htmlspecialchars($row['First_Name']);?></td>
                                <td><?php echo htmlspecialchars($row['Last_Name']);?></td>
                                <td><?php echo htmlspecialchars($row['Gender']);?></td>
                                <td><?php echo htmlspecialchars($row['Message']);?></td>
                                <td><?php echo htmlspecialchars($row['Message_Date']);?></td>
                                <td><?php echo htmlspecialchars($row['Email']);?></td>
                                </tr>
                            <?php } ?>
                        </tbody>
                </table>
            <?php } ?>
        </div>
    </section>

额外注意点

  • 所有输出到HTML的用户输入、数据库内容都用htmlspecialchars()转义,避免XSS攻击
  • 后续新增筛选项只需要按照性别筛选的逻辑:先校验参数合法性,再追加WHERE条件、绑定参数即可,不需要重构整体逻辑
  • 原表头拼写错误Lastmame已经修正为Lastname,如果你的数据库字段是其他拼写可以自行改回

内容的提问来源于stack exchange,提问作者Soupkiller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 02:45:30