
本文详解如何正确遍历 mysql 查询结果集,将多行图片路径数据组织为指定格式的嵌套关联数组,并序列化为标准 json,避免重复赋值与索引错乱问题。
本文详解如何正确遍历 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() 逐行读取结果集:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
// ✅ 安全查询(注意: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 (!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(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赋值,无需动态计数。
最终输出将严格匹配需求结构,且路径中的 / 不会被转义为 \/,确保前端可直接解析使用。










