为什么PHP处理SQL结果生成的$skus数组会缺失最后一项?
问题根因
你的代码仅在两种场景下会将组装完成的SKU数据推入结果数组$skus:
- 遍历数据库记录时,检测到当前记录的父ID与上一组父ID不一致,将上一组完整数据推入数组
- 遍历结束后,仅当总记录数等于1时,才将最后一组数据推入数组
当查询结果总记录数大于1时,最后一组记录遍历完成后没有下一条不同父ID的记录触发推入逻辑,同时也不满足总记录数=1的判定条件,最后一组数据就会被遗漏,这就是你缺失最后一条记录的原因。
修正方案
将遍历结束后的判定逻辑修改为:只要存在有效查询记录,就将最后一组组装好的SKU数据推入结果数组即可。
修正后的完整代码如下:
case 'skuLookup': $sql = "SELECT i.id, i.sku as parentSku, i.description as parentDescription, sku.item_sku as sku, sku.description FROM sku LEFT JOIN sku_vendor_pivot AS vp ON sku.id = vp.sku_vendor_fk LEFT JOIN sku_internal AS i ON i.id = vp.sku_fk WHERE i.sku LIKE '" . $dbh->escape($call['id']) . "%' AND i.id is not null"; $sql .= " UNION "; $sql .= "SELECT i.id, i.sku as parentSku, i.description as parentDescription, sku.item_sku as sku, sku.description FROM sku LEFT JOIN sku_vendor_pivot AS vp ON sku.id = vp.sku_vendor_fk LEFT JOIN sku_internal AS i ON i.id = vp.sku_fk WHERE sku.item_sku LIKE '" . $dbh->escape($call['id']) . "%' AND i.id is not null"; if(is_numeric($call['id'])) { $sql = "SELECT i.id, i.sku as parentSku, i.description as parentDescription, sku.item_sku as sku, sku.description FROM sku LEFT JOIN sku_vendor_pivot AS vp ON sku.id = vp.sku_vendor_fk LEFT JOIN sku_internal AS i ON i.id = vp.sku_fk WHERE i.id = " . $dbh->escape($call['id']) . " AND i.id is not null"; } $skus = array(); if($dbh->query($sql)) { $parent = null; $children = array(); $count = 0; while($dbh->next_record()) { $count++; if($parent == null) { $parent = $dbh->Record['id']; } if($parent != $dbh->Record['id']) { $sku['children'] = $children; $skus[] = $sku; $parent = $dbh->Record['id']; $children = array(); } $sku = array( 'description' => $dbh->Record['parentDescription'], 'value' => $dbh->Record['parentSku'], ); $children[] = $dbh->Record['sku'] . " - " . $dbh->Record['description']; } // 仅修改此处判定逻辑,移除count==1的限制 if($count > 0) { $sku['children'] = $children; $skus[] = $sku; } } $newData['skuLookup']['data'] = $skus; error_log("newData['skuLookup']['data'] data:\n" . print_r($newData['skuLookup']['data'], TRUE)); $data = array_merge($data,$newData); break;
内容的提问来源于stack exchange,提问作者CodeForGood
相关产品推荐
相关产品推荐

