使用FOREACH循环遍历PDO查询结果出现重复数据问题求助
解决PDO查询结果重复输出的问题
嗨,我一眼就看出问题出在哪啦!你用了PDO::FETCH_BOTH作为fetch的参数,这个模式会把每一行数据同时以索引数组(数字键)和关联数组(字段名键)两种格式返回。所以你的foreach($row as $k)会把每个字段的值输出两次——一次对应数字索引,一次对应字段名,这就是结果重复的原因。
给你两个简单的解决方案:
- 方案一:更换fetch模式(推荐)
直接把PDO::FETCH_BOTH换成PDO::FETCH_ASSOC(只返回关联数组,用字段名当键)或者PDO::FETCH_NUM(只返回索引数组,用数字当键),这样foreach就只会遍历一次每个字段的值了。修改后的代码如下:
<?php while($row=$stmt_header->fetch(PDO::FETCH_ASSOC)) { ?> <tr class="odd gradeA"> <form action='semesters.php' method='post'> <?php foreach($row as $value) { echo '<td>'. $value . '</td>'; } ?> </form> </tr> <?php } ?>
- 方案二:保留FETCH_BOTH,过滤重复项
如果你因为某些原因必须用FETCH_BOTH,可以在foreach里判断键的类型,只处理其中一种类型的键(比如只处理字符串类型的字段名键):
<?php while($row=$stmt_header->fetch(PDO::FETCH_BOTH)) { ?> <tr class="odd gradeA"> <form action='semesters.php' method='post'> <?php foreach($row as $key => $value) { // 只处理关联数组的字符串键,跳过数字索引 if(is_string($key)){ echo '<td>'. $value . '</td>'; } } ?> </form> </tr> <?php } ?>
另外提个小建议:HTML规范里<tr>的直接子元素应该是<td>,你现在把<form>放在<tr>里面虽然浏览器能兼容,但更规范的做法是把表单放到<td>内部,或者给每个需要提交的按钮单独绑定表单哦~
内容的提问来源于stack exchange,提问作者Manzu Gerald
相关产品推荐
相关产品推荐

