当前位置:首页 > Mysql教程 > 列表

如何将 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() 逐行读取结果集:

  1. // ✅ 安全查询(注意:mysql_* 已废弃,生产环境请改用 MySQLi 或 PDO) 
  2. $sImg = "SELECT prod_thumb160x90, prod_img1280x720 FROM product_img_detail WHERE prod_id = " . (int)$data2['id']; 
  3. $qPrd = mysql_query($sImg); 
  4.  
  5. if (!$qPrd) { 
  6.     die('Query failed: ' . mysql_error()); 
  7.  
  8. $imgPath = "img/e-commerce/product/"
  9. $count = 0; 
  10. $arrSm = []; 
  11. $arrLg = []; 
  12.  
  13. // ? 关键修正:while 循环遍历每一行,而非 foreach 字段 
  14. while ($rPrd = mysql_fetch_array($qPrd)) { 
  15.     $count++; 
  16.     // 确保字段非空再赋值 
  17.     if (!emptyempty($rPrd['prod_thumb160x90'])) { 
  18.         $arrSm["image{$count}"] = $imgPath . $rPrd['prod_thumb160x90']; 
  19.     } 
  20.     if (!emptyempty($rPrd['prod_img1280x720'])) { 
  21.         $arrLg["image{$count}"] = $imgPath . $rPrd['prod_img1280x720']; 
  22.     } 
  23.  
  24. // 组装目标结构 
  25. $arrImg = [ 
  26.     "thumb" => $arrSm
  27.     "large" => $arrLg 
  28. ]; 
  29.  
  30. $res = [ 
  31.     "selectedColor" => "black"
  32.     "black"         => $arrImg
  33.     "selectedSlide" => 0 
  34. ]; 
  35.  
  36. // 生成无转义斜杠的 JSON(PHP 5.4+ 支持 JSON_UNESCAPED_SLASHES) 
  37. $json = json_encode($res, JSON_UNESCAPED_SLASHES); 
  38. echo $json

重要注意事项:

安全性:原始代码存在 SQL 注入风险。务必对 $data2['id'] 进行类型转换(如 (int))或使用预处理语句;

兼容性:mysql_* 函数自 PHP 7.0 起已被移除,必须升级至 MySQLi 或 PDO。例如 MySQLi 写法:

  1. $stmt = $mysqli->prepare("SELECT prod_thumb160x90, prod_img1280x720 FROM product_img_detail WHERE prod_id = ?"); 
  2. $stmt->bind_param("i"$data2['id']); 
  3. $stmt->execute(); 
  4. $result = $stmt->get_result(); 
  5. while ($row = $result->fetch_assoc()) { /* ... */ } 

健壮性:添加空值校验,防止因某行字段为空导致 imageN 键缺失;

性能:若图片数量固定(如始终3张),可直接用索引 image1/image2/image3 赋值,无需动态计数。

最终输出将严格匹配需求结构,且路径中的 / 不会被转义为 \/,确保前端可直接解析使用。

Tags: MySQL查询结果构建JSON结构的多维数组

分享到: