PHP自动补全文本框执行多查询返回null的解决方法
修复多表自动补全返回null的问题
你的问题出在mysqli_multi_query的使用逻辑和结果集处理上,再加上代码存在严重的SQL注入风险,最终导致返回null。我来一步步帮你解决:
为什么当前代码会失效?
- 多结果集处理错误:
mysqli_multi_query执行多个查询后,第一个$result只对应第一条SQL的结果,第二条查询的结果需要手动调用mysqli_next_result()切换才能获取。而且你在同一个循环里同时取company_name和key_skills,但每个结果集只有对应的字段,这会导致取值失败,最终$data数组结构异常,json_encode返回null。 - 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
相关产品推荐
相关产品推荐

