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

PHP自动补全文本框执行多查询返回null的解决方法

修复多表自动补全返回null的问题

你的问题出在mysqli_multi_query的使用逻辑和结果集处理上,再加上代码存在严重的SQL注入风险,最终导致返回null。我来一步步帮你解决:

为什么当前代码会失效?

  1. 多结果集处理错误:mysqli_multi_query执行多个查询后,第一个$result只对应第一条SQL的结果,第二条查询的结果需要手动调用mysqli_next_result()切换才能获取。而且你在同一个循环里同时取company_name和key_skills,但每个结果集只有对应的字段,这会导致取值失败,最终$data数组结构异常,json_encode返回null。
  2. SQL注入风险:直接把用户输入的$_GET['term']拼进SQL语句,是非常危险的操作,容易被恶意利用。

推荐解决方案:用UNION合并查询(简洁又安全)

把两个表的查询用UNION ALL合并成一个语句,这样只需一次查询就能获取所有补全选项,同时用预处理语句彻底解决注入问题:

<?php
session_start();
include('config.php');

// 先校验必要参数是否存在
if (!isset($_SESSION['student_id']) || !isset($_GET['term'])) {
    echo json_encode([]);
    exit;
}

$searchTerm = $_GET['term'];

// 用UNION合并两个查询,统一字段别名方便后续处理
$query = "SELECT company_name AS suggestion FROM company WHERE company_name LIKE ? 
          UNION ALL 
          SELECT key_skills AS suggestion FROM skill_master WHERE key_skills LIKE ? 
          ORDER BY suggestion ASC";

// 初始化预处理语句
$stmt = mysqli_prepare($con, $query);
if (!$stmt) {
    echo json_encode([]);
    exit;
}

// 绑定模糊匹配的参数
$likeTerm = "%{$searchTerm}%";
mysqli_stmt_bind_param($stmt, "ss", $likeTerm, $likeTerm);
mysqli_stmt_execute($stmt);

// 获取结果并整理成数组
$result = mysqli_stmt_get_result($stmt);
$data = [];
while ($row = mysqli_fetch_assoc($result)) {
    $data[] = $row['suggestion'];
}

// 输出JSON结果
echo json_encode($data);

// 清理资源
mysqli_stmt_close($stmt);
mysqli_close($con);
?>

如果你坚持用multi_query(不推荐)

如果一定要保留多查询的写法,需要正确处理多个结果集,同时记得转义用户输入:

<?php
session_start();
include('config.php');

if (!isset($_SESSION['student_id']) || !isset($_GET['term'])) {
    echo json_encode([]);
    exit;
}

$searchTerm = mysqli_real_escape_string($con, $_GET['term']);
$query = "SELECT company_name FROM company WHERE company_name LIKE '%{$searchTerm}%' ORDER BY company_name ASC;";
$query .= "SELECT key_skills FROM skill_master WHERE key_skills LIKE '%{$searchTerm}%' ORDER BY key_skills ASC;";

$result = mysqli_multi_query($con, $query);
$data = [];

// 循环处理所有结果集
if ($result) {
    do {
        if ($resultSet = mysqli_store_result($con)) {
            while ($row = mysqli_fetch_assoc($resultSet)) {
                // 根据存在的字段名添加对应值
                if (isset($row['company_name'])) {
                    $data[] = $row['company_name'];
                } elseif (isset($row['key_skills'])) {
                    $data[] = $row['key_skills'];
                }
            }
            mysqli_free_result($resultSet);
        }
    } while (mysqli_next_result($con));
}

echo json_encode($data);
mysqli_close($con);
?>

不过还是强烈推荐第一种方案,既安全又高效,代码逻辑也更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:00:50