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

使用mysqli_multi_query()查询出现空值重复结果的原因排查

问题原因及解决方案

嘿,我来帮你搞清楚这些空值的由来~

为什么会出现空值?

你的代码里用mysqli_multi_query()连续执行了两个查询:

  • 第一个查询从ts_students_log表取数据,这个表包含user_id、mobile、email字段,但没有name字段
  • 第二个查询从ts_students_info表取数据,这个表包含user_id、name字段,但没有mobile和email字段

当你统一用固定格式输出所有字段时,每个结果集里不存在的字段自然会返回空值:

  • 第一个结果集(来自ts_students_log)的name为空,所以出现Name:- 的情况
  • 第二个结果集(来自ts_students_info)的mobile和email为空,所以出现Mobile: Email:-Name:-XXX的情况

更好的解决方案:合并查询(推荐)

其实完全不需要用mysqli_multi_query(),可以通过SQL的JOIN语句把三个表关联起来,一次查询就能拿到所有完整的用户信息,不仅能解决空值问题,还能提升查询效率:

<?php
// 用JOIN关联三个表,一次性获取完整数据
$sql = "SELECT l.user_id, l.mobile, l.email, i.name 
        FROM ts_users_skills s
        INNER JOIN ts_students_log l ON s.user_id = l.user_id
        INNER JOIN ts_students_info i ON s.user_id = i.user_id
        WHERE s.skillsTeach='Photoshop'";

if($res = mysqli_query($conn, $sql)) {
    while ($row = mysqli_fetch_assoc($res)) {
        echo "Id: " . $row['user_id']. " Mobile: " . $row['mobile']. " Email:-" . $row['email'] . " Name:-" .$row['name'] . "<br/>";
    }
    mysqli_free_result($res);
}
?>

额外提醒:避免SQL注入风险

你的原代码直接把$id拼到SQL语句里,存在严重的SQL注入风险!即使是用mysqli_multi_query(),也应该使用预处理语句来处理动态参数。上面的JOIN查询已经避免了拼接参数的问题,如果你以后需要处理动态参数,记得用mysqli_prepare()、mysqli_stmt_bind_param()这类方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:17:29