如何在同一个 HTML 表格中显示来自多个数据库表的数据

本文讲解如何通过 sql join 高效地将 `tick` 和 `users` 两张表的数据合并查询,并在单个 html 表格中正确展示,避免因多次嵌套查询导致的空数组访问错误和性能问题。

在 Web 开发中,常需将主表(如工单表 tick)与关联表(如用户表 users)的数据联合展示于同一张 HTML 表格中。你当前的代码存在两个关键问题:逻辑错误性能缺陷

❌ 错误原因分析

你首次执行了 $mysql5 = mysqli_query(...) 查询 tick 表,并用 mysqli_fetch_array($mysql5) 提前取走第一行数据(即 if($indtbl = mysqli_fetch_array($mysql5)) { ... }),导致后续 while($rowten = mysqli_fetch_array($mysql5)) 实际从第二行开始遍历;更严重的是,你在循环外单独执行了一次 users 查询($findresults2323),然后试图在循环内反复调用 mysqli_fetch_array($findresults23) —— 但该结果集只有一行且已被读取一次,后续调用返回 null,从而触发 Notice: Trying to access array offset on value of type null。

此外,若 assignto 字段为空、不存在对应用户,或查询失败,$retrive11 将为 null,直接访问 $retrive11['fname'] 必然报错。

✅ 推荐方案:使用 LEFT JOIN 一次性获取全部数据

最佳实践是用一条 SQL 完成关联查询,避免 N+1 查询问题(即每条工单都发起一次用户查询)。以下是优化后的完整示例:

? 渲染表格(安全健壮版)

Title Company Ticket ID Assign To Priority
"> "> "> "> Unassigned'; ?> ">

⚠️ 关键注意事项

  • 永远不要在循环内执行数据库查询(除非绝对必要且已缓存),它会随数据量增长呈线性性能衰减;
  • 使用 LEFT JOIN 而非 INNER JOIN,确保即使 assignto 未分配用户,工单仍能正常显示;
  • 对所有输出到 HTML 的变量使用 htmlspecialchars() 防止 XSS 攻击;
  • 检查关联字段是否为 NULL(如 !empty($row['fname'])),避免未定义索引警告;
  • 建议为 tick.assignto 和 users.id 字段添加索引,提升 JOIN 效率。

通过以上重构,你不仅修复了运行时错误,还显著提升了代码可维护性与系统响应性能。