You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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);

核心修复点

  1. 改用fetch_assoc():只返回关联数组,避免重复遍历索引键,解决循环次数异常
  2. while循环遍历结果集:每次循环读取新的一行数据,解决图片路径重复问题
  3. 添加JSON_UNESCAPED_SLASHES参数:让json_encode不转义斜杠,匹配示例格式
  4. 使用mysqli预处理语句:避免SQL注入,适配PHP新版本
  5. 修正路径前缀:改为../img/,和示例中的相对路径格式一致

内容的提问来源于stack exchange,提问作者Willie Sandi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 16:24:31