数据库有多条数据时如何仅回显一次数据?附现有代码
解决数据库多条数据仅回显一次的问题
首先得指出你现有代码里的两个核心问题:一是只执行了一次mysqli_fetch_array($query),所以循环里每次输出的都是同一条数据;二是循环的写法不对,没有正确遍历所有查询结果。下面给你两种实现“仅回显一次数据”(也就是去重)的方案,同时修正遍历逻辑:
方案一:SQL层面直接去重(推荐,效率更高)
直接在SQL查询中使用DISTINCT关键字,让数据库返回不重复的namaproduk结果,从源头上避免重复数据:
// 先处理SQL注入风险,这一步一定要做! $produk = mysqli_real_escape_string($con, $produk); // 只查询需要的字段+DISTINCT去重,比SELECT *更高效 $sql = "SELECT DISTINCT namaproduk FROM tbproduk WHERE namaproduk LIKE '$produk%'"; $query = mysqli_query($con, $sql) or die("error $sql"); // 正确遍历所有结果的方式:用while循环不断取数据,直到没有更多结果 while ($result = mysqli_fetch_array($query)) { $namaproduk = $result['namaproduk']; echo "<button style='color: black;text-align: left'><a style='padding: 0;line-height: 0;color: black;background: none' href='Konfirmasi/index4.php?produk=$namaproduk'>".$namaproduk."</a></button>"; }
小贴士:更安全的做法是使用预处理语句来彻底避免SQL注入,上面用
mysqli_real_escape_string是基础的防护方式;另外如果不需要表中其他字段,尽量不要用SELECT *,只查询需要的字段能减少数据传输,提升性能。
方案二:PHP层面过滤重复数据
如果因为业务限制不能修改SQL,可以在PHP里用一个数组记录已经输出过的产品名,避免重复输出:
$produk = mysqli_real_escape_string($con, $produk); $sql = "SELECT * FROM tbproduk WHERE namaproduk LIKE '$produk%'"; $query = mysqli_query($con, $sql) or die("error $sql"); // 用数组存储已经输出过的产品名 $displayedProducts = []; while ($result = mysqli_fetch_array($query)) { $namaproduk = $result['namaproduk']; // 检查当前产品名是否已经输出过 if (!in_array($namaproduk, $displayedProducts)) { echo "<button style='color: black;text-align: left'><a style='padding: 0;line-height: 0;color: black;background: none' href='Konfirmasi/index4.php?produk=$namaproduk'>".$namaproduk."</a></button>"; // 将已输出的产品名加入数组 $displayedProducts[] = $namaproduk; } }
为什么你的原代码会重复输出同一条?
你原来只调用了一次mysqli_fetch_array($query),这个函数每次调用才会从结果集中取下一条数据,而你在for循环里没有再次调用它,所以循环的每一次都是在用第一次取到的那条数据,自然只会重复输出同一条内容。
内容的提问来源于stack exchange,提问作者Eric Anthony Wu
相关产品推荐
相关产品推荐

