从MySQL获取数据时查询列仅返回单行且重复的问题
解决MySQL查询仅返回一行重复数据的问题
看起来你在从MySQL列获取数据生成下拉选项时,遇到了只返回一行且重复的情况,我来帮你一步步排查和解决:
首先排查核心问题点
1. 检查mapel类中tampil()方法的实现
最常见的问题是这个方法没有正确返回所有查询结果,而是只返回了单个值。比如如果你的方法是这么写的:
public function tampil() { $query = "SELECT nama_mapel FROM mapel WHERE tingkat = ?"; $stmt = $this->db->prepare($query); $stmt->bind_param("s", $this->tingkat); $stmt->execute(); $result = $stmt->get_result(); // 错误:只获取了一行数据,返回单个字符串 $row = $result->fetch_assoc(); return $row['nama_mapel']; }
这种情况下,方法只会返回第一条匹配的数据,如果你后续不小心重复输出这个值(比如多次写<option><?php echo $namaMapel; ?></option>),就会出现重复的同一行。
修正方法:让tampil()返回所有结果的数组:
public function tampil() { $query = "SELECT nama_mapel FROM mapel WHERE tingkat = ?"; $stmt = $this->db->prepare($query); $stmt->bind_param("s", $this->tingkat); $stmt->execute(); $result = $stmt->get_result(); $mapelList = []; // 循环获取所有结果存入数组 while ($row = $result->fetch_assoc()) { $mapelList[] = $row['nama_mapel']; } return $mapelList; }
2. 修正前端循环输出的代码
如果你的tampil()已经返回了数组,但输出时没有正确循环,也会导致重复。比如之前的代码可能没有用循环,而是手动写了多个<option>标签,或者循环逻辑错误。
正确的输出代码:
<div id="Mapel"> <label for="mapel">Mapel </label> <button type="button" name="tambahMapel" id="tambahMapel" class="btn btn-info" title="Tambah Mapel">+</button> <select name="mapel" class="form-control"> <option selected>Pilih...</option> <?php require_once '../class/mapel.php'; $mapel = new mapel(NULL,$tingkat); $namaMapelList = $mapel->tampil(); // 循环遍历数组,生成每个选项 foreach ($namaMapelList as $nama) { ?> <option value="<?php echo $nama; ?>"><?php echo $nama; ?></option> <?php } ?> </select> </div>
3. 数据库层面的排查
- 先登录MySQL,手动执行查询语句:
SELECT nama_mapel FROM mapel WHERE tingkat = '你的tingkat值';,看看返回的结果是不是真的有多条,还是数据库里本身只有一条数据。 - 如果查询结果里有重复的行(比如同一个
nama_mapel对应同一个tingkat出现多次),可以在查询语句中加入DISTINCT来去重:SELECT DISTINCT nama_mapel FROM mapel WHERE tingkat = ?;
总结
大概率是你的数据获取方法没有返回完整的结果集,或者输出时没有正确循环遍历结果。按照上面的步骤逐一排查,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者ahmad reza
相关产品推荐
相关产品推荐

