数组存在重复数据时限制页面访问的PHP代码问题排查
问题分析与修复方案
我一眼就瞅出你代码里的问题啦——你的第二个foreach循环逻辑踩坑了!当数组里同时存在重复和不重复元素时,循环会挨个执行跳转指令,可浏览器只会响应最后一个header()跳转。比如你的例子里,先碰到100100(重复,触发跳首页),但循环没停,后面又遇到100300(不重复,触发跳问卷),最后浏览器就执行了最后那个跳转指令,这就是为啥明明有重复却跳错页面的原因。
修正思路
根本不用遍历统计后的数组瞎折腾!我们只要一旦发现存在重复元素,立刻跳转首页并终止脚本;如果确认所有元素都不重复,再跳问卷页面就行。而且PHP有现成的函数能快速判断数组是否有重复,没必要自己写统计逻辑~
方案一:极简版(强烈推荐)
直接用PHP内置函数对比数组长度:
$no_id = array('100100','100200','100300','100200','100200','100100'); // 原数组和去重后的数组长度不一样,就说明有重复 if (count($no_id) !== count(array_unique($no_id))) { header('location:../../home'); exit; // 必须加这句!终止脚本,防止后续代码搞事情 } else { header('location:../../questionnair'); exit; }
方案二:基于你原有代码的修复
要是你想保留自己的统计逻辑,那得改改判断方式,找到重复就立刻停手:
$no_id = array('100100','100200','100300','100200','100200','100100'); $array = array(); foreach ($no_id as $key => $value) { if(isset($array[$value])) { $array[$value] += 1; } else { $array[$value] = 1; } } // 先标记是否有重复,找到就跳出循环 $hasDuplicate = false; foreach ($array as $alert => $n) { if($n >= 2) { $hasDuplicate = true; break; // 找到重复就不用继续找啦 } } // 最后统一判断跳转 if ($hasDuplicate) { header('location:../../home'); } else { header('location:../../questionnair'); } exit; // 别忘了终止脚本!
关键提醒
- 跳转后一定要加
exit;或者die();,不然脚本会继续往下跑,可能出现各种奇怪的问题。 header()必须在任何输出(包括空格、HTML标签)之前调用,要是之前有输出,可以用ob_start()开启输出缓冲来解决。
内容的提问来源于stack exchange,提问作者Aqua Rius
相关产品推荐
相关产品推荐

