使用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
相关产品推荐
相关产品推荐

