PHP循环遍历WordPress双表数据时多出一行的问题排查
重复行问题原因及修复
问题根源
外层循环的终止条件错误:
原代码中外层循环写为 for($l = 0; $l <=count($pArray); $l++),这里的<=count($pArray)会导致循环多执行一次。
假设$pArray包含3个元素(对应你要生成的3行数据),数组索引为0、1、2,count($pArray)返回3。循环会依次执行$l=0、1、2、3四次:
- 当$l=3时,
$pArray[3]属于数组越界访问,返回值为null $titem = $item + 1即null + 1,结果为1- 内层循环匹配到id=1的产品,因此重复生成了第一行的内容
修复方案
将外层循环的终止条件改为< count($pArray),确保循环只遍历数组的有效索引:
for($l = 0; $l < count($pArray); $l++){ // 原循环内代码不变 }
额外优化建议
- 避免SQL注入风险:原代码直接将
$_POST['pqrnum']拼接到SQL语句中,存在安全隐患,应使用WordPress内置的$wpdb->prepare()方法:
$results = $wpdb->get_results($wpdb->prepare('SELECT * FROM eqnum WHERE id=%d', $tid));
- 优化查询逻辑:使用SQL关联查询代替嵌套循环,减少数据库操作次数,提升性能:
$tid = $_POST['pqrnum']; // 直接通过关联查询获取所需数据 $results = $wpdb->get_results($wpdb->prepare( 'SELECT e.id, e.name FROM eqnum q JOIN eparts e ON FIND_IN_SET(e.id - 1, q.pnum) WHERE q.id=%d', $tid )); $ptable = "<table>"; foreach($results as $row){ $ptable .= "<tr><td>item num ". ($row->id) ." presults id ".$row->id." presults name ".$row->name."</td></tr>"; } $ptable .= "</table>";
内容的提问来源于stack exchange,提问作者JLongBeard
相关产品推荐
相关产品推荐

