如何将 MySQL 查询结果构建成嵌套 JSON 结构的多维数组
发布:smiling 来源: PHP粉丝网 添加日期:2026-09-21 12:01:57 浏览: 评论:0
本文详解如何正确遍历 mysql 查询结果集,将多行图片路径数据组织为指定格式的嵌套关联数组,并序列化为标准 json,避免重复赋值与索引错乱问题。
在实际电商项目中,常需将数据库中按颜色/尺寸分类存储的多张产品图(如缩略图、大图)动态组装为结构清晰的 JSON 数据,供前端轮播或色块切换使用。但初学者易陷入两个典型误区:一是误用 mysql_fetch_array() 的单行结果做循环(导致所有 imageN 均指向同一行字段),二是未正确迭代结果集(仅取首行,造成数据截断)。
原始代码的问题根源在于:
mysql_fetch_array($qPrd) 仅获取第一行结果,后续 foreach ($rPrd as $row) 实际是在遍历该行的字段键值对(即 prod_thumb160x90, prod_img1280x720, 数字索引等),而非多行记录;
因此 $count++ 在字段级循环中被多次触发,而 $rPrd['prod_thumb160x90'] 始终是同一值,最终所有 image1–image4 都重复填充首行数据。
✅ 正确做法是使用 while 循环配合 mysql_fetch_array() 逐行读取结果集:
- // ✅ 安全查询(注意:mysql_* 已废弃,生产环境请改用 MySQLi 或 PDO)
- $sImg = "SELECT prod_thumb160x90, prod_img1280x720 FROM product_img_detail WHERE prod_id = " . (int)$data2['id'];
- $qPrd = mysql_query($sImg);
- if (!$qPrd) {
- die('Query failed: ' . mysql_error());
- }
- $imgPath = "img/e-commerce/product/";
- $count = 0;
- $arrSm = [];
- $arrLg = [];
- // ? 关键修正:while 循环遍历每一行,而非 foreach 字段
- while ($rPrd = mysql_fetch_array($qPrd)) {
- $count++;
- // 确保字段非空再赋值
- if (!emptyempty($rPrd['prod_thumb160x90'])) {
- $arrSm["image{$count}"] = $imgPath . $rPrd['prod_thumb160x90'];
- }
- if (!emptyempty($rPrd['prod_img1280x720'])) {
- $arrLg["image{$count}"] = $imgPath . $rPrd['prod_img1280x720'];
- }
- }
- // 组装目标结构
- $arrImg = [
- "thumb" => $arrSm,
- "large" => $arrLg
- ];
- $res = [
- "selectedColor" => "black",
- "black" => $arrImg,
- "selectedSlide" => 0
- ];
- // 生成无转义斜杠的 JSON(PHP 5.4+ 支持 JSON_UNESCAPED_SLASHES)
- $json = json_encode($res, JSON_UNESCAPED_SLASHES);
- echo $json;
重要注意事项:
安全性:原始代码存在 SQL 注入风险。务必对 $data2['id'] 进行类型转换(如 (int))或使用预处理语句;
兼容性:mysql_* 函数自 PHP 7.0 起已被移除,必须升级至 MySQLi 或 PDO。例如 MySQLi 写法:
- $stmt = $mysqli->prepare("SELECT prod_thumb160x90, prod_img1280x720 FROM product_img_detail WHERE prod_id = ?");
- $stmt->bind_param("i", $data2['id']);
- $stmt->execute();
- $result = $stmt->get_result();
- while ($row = $result->fetch_assoc()) { /* ... */ }
健壮性:添加空值校验,防止因某行字段为空导致 imageN 键缺失;
性能:若图片数量固定(如始终3张),可直接用索引 image1/image2/image3 赋值,无需动态计数。
最终输出将严格匹配需求结构,且路径中的 / 不会被转义为 \/,确保前端可直接解析使用。
Tags: MySQL查询结果构建JSON结构的多维数组
- 上一篇:php连接本地mysql连接错误的问题解决方法
- 下一篇:最后一页
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)
