PHP使用UNION联合查询两张表失败,报错No Data Found求排查
问题分析与解决方案
你的代码存在三个核心问题,导致无法正常获取并展示两张表的数据:
- SQL语句错误:
UNION要求两个查询返回的列数、对应列的数据类型必须完全匹配。如果topic和Image表的结构不一致(比如列数不同、列类型不兼容),这条SQL会直接执行失败,mysqli_query返回false,触发else分支返回No Data Found。 - 循环逻辑冗余且存在bug:你在while循环里重复对整个数组编码JSON,完全没必要;且
while($row[] = $resultAll->fetch_assoc())的写法会在数组末尾多存入一个null值(因为最后一次fetch_assoc返回false,会被存入$row)。 - 未处理查询成功但无数据的场景:如果SQL执行成功但两张表都没有数据,循环不会执行,
$json变量会未定义,导致输出错误。
分场景解决方案
场景1:两张表结构完全相同(列数、类型一致)
如果是想合并两张表的结果展示,修正SQL并优化代码:
require_once 'cont.php'; // 用UNION ALL代替UNION(无需去重时性能更好) $resultAll = mysqli_query($con, "SELECT * FROM topic UNION ALL SELECT * FROM Image"); if ($resultAll) { $data = []; // 循环收集所有数据 while ($row = $resultAll->fetch_assoc()) { $data[] = $row; } // 判断是否有数据,无数据时返回提示 $json = empty($data) ? json_encode(["result" => "No Data Found"]) : json_encode($data, JSON_NUMERIC_CHECK); } else { // SQL执行失败时返回错误信息,便于调试 $json = json_encode([ "result" => "SQL Execute Failed", "error" => mysqli_error($con) ]); } echo $json; $con->close(); ?>
场景2:两张表结构不同(更常见的情况)
如果两张表结构不一致,不能使用UNION,需分别查询后合并结果:
require_once 'cont.php'; $response = []; // 查询topic表数据 $resultTopic = mysqli_query($con, "SELECT * FROM topic"); if ($resultTopic) { $topicData = []; while ($row = $resultTopic->fetch_assoc()) { $topicData[] = $row; } $response['topic'] = empty($topicData) ? "No Data in topic" : $topicData; } else { $response['topic'] = "Query Failed: " . mysqli_error($con); } // 查询Image表数据 $resultImage = mysqli_query($con, "SELECT * FROM Image"); if ($resultImage) { $imageData = []; while ($row = $resultImage->fetch_assoc()) { $imageData[] = $row; } $response['image'] = empty($imageData) ? "No Data in Image" : $imageData; } else { $response['image'] = "Query Failed: " . mysqli_error($con); } $json = json_encode($response, JSON_NUMERIC_CHECK); echo $json; $con->close(); ?>
内容的提问来源于stack exchange,提问作者M Al
相关产品推荐
相关产品推荐

