PHP7实现MySQL多字段搜索功能 查询无结果如何解决
问题原因梳理
- 核心SQL逻辑错误:原SQL语句
$sql = "SELECT * from house WHERE $type like '%$postcode%'";将表单提交的房产类型值(如Terraced)作为查询字段,去匹配邮编输入值,和需求完全不符。正确逻辑应为postcode字段匹配用户输入的邮编,可选追加type字段匹配选择的房产类型。 - 缺少参数合法性校验:直接读取
$_POST值未做存在性判断,用户未输入邮编直接提交时会抛出PHP警告。 - 存在SQL注入风险:直接将用户输入的内容拼接进SQL语句,未做过滤或使用预处理语句,存在严重安全隐患。
- 筛选条件逻辑不匹配需求:需要支持「仅输入邮编」「同时输入邮编+房产类型」两种查询场景,原SQL固定只有一个错误的判断条件,无法覆盖使用场景。
- 表单控件逻辑缺陷:房产类型下拉选择框没有默认的「不限」选项,用户无法只按邮编进行查询。
修复方案
HTML修改代码
<form action="phpSearch.php" method="post"> <input type="text" placeholder="请输入邮编" name="postcode" id="postcode" required> <select name="type" id="type"> <option value="">不限房产类型</option> <option value="Terraced">Terraced</option> <option value="Detached">Detached</option> </select> <button type="submit" name="submit">搜索</button> </form>
PHP修改代码
<?php // 校验参数是否提交 $postcode = isset($_POST['postcode']) ? trim($_POST['postcode']) : ''; $type = isset($_POST['type']) ? trim($_POST['type']) : ''; // 邮编是必填项,为空直接提示 if (empty($postcode)) { die("请输入要搜索的邮编"); } $servername = "localhost"; $username = "root"; $password = ""; $db = "priceverification"; $conn = new mysqli($servername, $username, $password, $db); if ($conn->connect_error){ die("连接失败: ". $conn->connect_error); } // 动态拼接SQL条件 $sql = "SELECT postcode, type, town FROM house WHERE postcode LIKE ?"; $params = ['%' . $postcode . '%']; $types = 's'; // 标记第一个参数为字符串类型 // 如果选择了房产类型,追加筛选条件 if (!empty($type)) { $sql .= " AND type = ?"; $params[] = $type; $types .= 's'; } // 使用预处理语句防止SQL注入 $stmt = $conn->prepare($sql); $stmt->bind_param($types, ...$params); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()){ echo $row["postcode"]." ".$row["type"]." ".$row["town"]."<br>"; } } else { echo "0 条匹配结果"; } $stmt->close(); $conn->close(); ?>
修复说明
- 给下拉选择框新增了不限类型的默认选项,支持仅按邮编搜索的场景
- 新增参数校验逻辑,避免PHP报错和非法查询
- 修正SQL查询逻辑,按邮编模糊匹配,可选匹配房产类型,完全符合需求
- 使用mysqli预处理语句,彻底避免SQL注入风险
- 明确指定查询字段,代替
SELECT *提升查询效率
内容的提问来源于stack exchange,提问作者Giuseppe Draghetti
相关产品推荐
相关产品推荐

