如何将MySQL查询结果转为指定结构的无重复无转义JSON数组?
解决PHP生成指定结构JSON的问题
需求说明
需要从product_img_detail表查询数据,生成指定结构的JSON数组,示例结构如下:
{"selectedColor": "black", "black": { "thumb": { "image1": "../img/e-commerce/product/dark-small-1.jpg", "image2": "../img/e-commerce/product/dark-small-2.jpg", "image3": "../img/e-commerce/product/dark-small-3.jpg" }, "large": { "image1": "../img/e-commerce/product/dark-large-1.jpg", "image2": "../img/e-commerce/product/dark-large-2.jpg", "image3": "../img/e-commerce/product/dark-large-3.jpg" } }, "selectedSlide": 0 }
原代码问题总结
- 图片路径重复:循环中始终读取同一行的固定字段值,未遍历所有查询结果行
- 斜杠被转义:
json_encode默认会转义路径中的斜杠 - 循环次数异常:
mysql_fetch_array()默认返回关联+索引混合数组,遍历会重复处理每个字段的两种键名,导致循环次数翻倍 - 使用废弃函数:
mysql_*系列函数已被PHP废弃,存在安全和兼容性问题
修复后的代码
基于mysqli重构(替代废弃的mysql扩展):
// 假设已通过mysqli建立数据库连接,$conn为连接实例 $prodId = $data2['id']; // 预处理语句防止SQL注入 $sql = "SELECT prod_thumb160x90, prod_img1280x720 FROM product_img_detail WHERE prod_id = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $prodId); $stmt->execute(); $result = $stmt->get_result(); $imgBasePath = "../img/e-commerce/product/"; $thumbImages = []; $largeImages = []; $imageIndex = 0; // 遍历所有查询结果行 while ($row = $result->fetch_assoc()) { $imageIndex++; $thumbImages["image{$imageIndex}"] = $imgBasePath . $row['prod_thumb160x90']; $largeImages["image{$imageIndex}"] = $imgBasePath . $row['prod_img1280x720']; } // 组装目标结构 $finalData = [ "selectedColor" => "black", "black" => [ "thumb" => $thumbImages, "large" => $largeImages ], "selectedSlide" => 0 ]; // 输出JSON,取消斜杠转义 echo json_encode($finalData, JSON_UNESCAPED_SLASHES);
核心修复点
- 改用
fetch_assoc():只返回关联数组,避免重复遍历索引键,解决循环次数异常 - while循环遍历结果集:每次循环读取新的一行数据,解决图片路径重复问题
- 添加
JSON_UNESCAPED_SLASHES参数:让json_encode不转义斜杠,匹配示例格式 - 使用mysqli预处理语句:避免SQL注入,适配PHP新版本
- 修正路径前缀:改为
../img/,和示例中的相对路径格式一致
内容的提问来源于stack exchange,提问作者Willie Sandi
相关产品推荐
相关产品推荐

