PHP While循环优化:仅获取首个商品图片URL以避免重复展示
解决PHP循环重复展示商品的问题
你的问题根源很明确:关联catalog_product_entity_media_gallery后,每个商品对应多条图片记录,导致查询结果里同一商品会出现多次,循环时就跟着重复输出了。这里给你两种实用的解决方案:
方案1:修改SQL查询(推荐,从根源减少冗余数据)
直接在SQL层面让每个商品只返回第一条图片记录,这样查询结果里每个商品只有一行,循环自然不会重复。调整后的查询语句如下:
SELECT -- 子查询获取每个商品的首张图片URL (SELECT value FROM catalog_product_entity_media_gallery mg WHERE mg.entity_id = cpe.entity_id LIMIT 1) AS image_url, cg.customer_group_code, cpv.value, cpe.sku, cpetp.qty, cpetp.value FROM `catalog_product_entity_tier_price` cpetp JOIN catalog_product_entity cpe ON cpe.entity_id = cpetp.entity_id JOIN customer_group cg ON cg.customer_group_id = cpetp.customer_group_id JOIN catalog_product_entity_varchar cpv ON cpv.entity_id = cpe.entity_id WHERE cg.customer_group_code = '$gruppe' AND cpv.attribute_id = 71
对应的PHP代码里,把图片URL的赋值改成:
$bilddaten = $row['image_url'];
方案2:在PHP循环中过滤重复商品
如果不想改动SQL,可以在循环里记录已经处理过的商品SKU,遇到重复的就跳过:
<?php require ('db.inc.php'); echo mysql_error(); ?> <form action="#" method="get"> Kundennr: <input type="text" name="nummer" /><br /> <input type="Submit" value="Absenden" /> </form> <?php if ($_GET['nummer']) { $gruppe = $_GET['nummer']; echo $gruppe.":<br>"; $result = mysql_query("SELECT catalog_product_entity_media_gallery.value, customer_group_code, catalog_product_entity_varchar.value, sku, qty, catalog_product_entity_tier_price.value FROM `catalog_product_entity_tier_price` JOIN catalog_product_entity on catalog_product_entity.entity_id = catalog_product_entity_tier_price.entity_id JOIN customer_group ON customer_group.customer_group_id = catalog_product_entity_tier_price.customer_group_id JOIN catalog_product_entity_varchar ON catalog_product_entity_varchar.entity_id = catalog_product_entity.entity_id JOIN catalog_product_entity_media_gallery ON catalog_product_entity_media_gallery.entity_id = catalog_product_entity.entity_id WHERE customer_group_code = '$gruppe' AND catalog_product_entity_varchar.attribute_id = 71"); $processed_skus = []; // 存储已处理过的商品SKU while ($row = mysql_fetch_array($result)) { $bilddaten = $row[0]; $ids = $row[1]; $ids1 = $row[2]; $ids2 = $row[3]; $ids3 = $row[4]; $ids4 = $row[5]; // 如果当前SKU已经处理过,直接跳过本次循环 if (in_array($ids2, $processed_skus)) { continue; } // 标记该SKU为已处理 $processed_skus[] = $ids2; echo "<img src='http://localhost/media/catalog/product/cache/1/thumbnail/60x60/9df78eab33525d08d6e5fb8d27136e95/".$bilddaten."' >"; echo "Art.Nr.: ".$ids2." Bezeichung: ".$ids1." ->Menge: ".$ids3." Preis: ".$ids4."<br><br>"; } } ?>
另外提个小提醒:mysql_*系列函数已经被PHP官方废弃了,建议后续换成mysqli_*或者PDO,安全性和兼容性都会更好。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

