
本文详解如何正确遍历 MySQL 查询的多行结果,动态生成符合前端需求的嵌套结构 JSON(如按颜色分组、含 thumb/large 图片集),并规避 mysql_fetch_array() 单行误用导致的重复赋值问题。
本文详解如何正确遍历 mysql 查询的多行结果,动态生成符合前端需求的嵌套结构 json(如按颜色分组、含 thumb/large 图片集),并规避 `mysql_fetch_array()` 单行误用导致的重复赋值问题。
在构建电商类图片配置 JSON 时,常见需求是将数据库中同一商品的多张缩略图(prod_thumb160x90)和大图(prod_img1280x720)按颜色归类,组织为类似以下结构的数组:
{
"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
}
但初版代码中存在一个关键错误:误将 mysql_fetch_array() 当作可遍历的数组直接 foreach。实际上,mysql_fetch_array() 每次只返回单行记录(关联+数字索引混合数组),而 foreach ($rPrd as $row) 实际是在遍历该单行的所有字段键(包括数字索引),导致 image1, image2, ... 被反复写入相同字段值(如 dark-small-1.jpg),造成数据错乱与数量膨胀。
✅ 正确做法是:使用 while 循环持续调用 mysql_fetch_array() 获取每一行结果,每行对应一组图片路径,再逐行累加到 thumb 和 large 子数组中:
// ✅ 安全查询(注意:mysql_* 已废弃,仅作示例逻辑说明)
$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 ($rPrd = mysql_fetch_array($qPrd)) {
$count++;
// 确保字段非空,避免生成无效路径
if (!empty($rPrd['prod_thumb160x90'])) {
$arrSm["image{$count}"] = $imgPath . $rPrd['prod_thumb160x90'];
}
if (!empty($rPrd['prod_img1280x720'])) {
$arrLg["image{$count}"] = $imgPath . $rPrd['prod_img1280x720'];
}
}
// 构建最终嵌套结构
$arrImg = [
"thumb" => $arrSm,
"large" => $arrLg
];
$res = [
"selectedColor" => "black",
"black" => $arrImg,
"selectedSlide" => 0
];
// 输出 JSON(自动处理斜杠转义;如需原始斜杠,可用 JSON_UNESCAPED_SLASHES)
$json = json_encode($res, JSON_UNESCAPED_SLASHES);
echo $json;
⚠️ 重要注意事项:
-
*`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()) { $count++; $arrSm["image{$count}"] = $imgPath . $row['prod_thumb160x90']; $arrLg["image{$count}"] = $imgPath . $row['prod_img1280x720']; } SQL 注入防护:务必对
$data2['id']进行整型转换(如(int))或使用预处理语句,禁止直接拼接用户数据。路径拼接健壮性:建议检查字段是否为空,避免生成
img/e-commerce/product/这样的无效路径。动态颜色支持:若需支持多种颜色(如
"red","blue"),可将"black"替换为变量$color = $data2['color'] ?? 'black',并确保数据库有对应颜色字段。
通过修正遍历逻辑、升级数据库扩展、强化输入校验,即可高效、安全地生成结构清晰、前端可直用的嵌套 JSON 数据。











