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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:09:03