为何PHP整数判断if条件失效?rank_code为0却跳转到home_1
问题分析与解决方案
嘿,你遇到的这个问题是典型的PHP逻辑运算符优先级和条件表达式写法错误导致的!
为什么原代码会失效?
你写的条件if($row['rank_code'] == 13 or 14),在PHP里会被解析成:
if( ($row['rank_code'] == 13) or 14 )
因为or的优先级比==低,所以先执行左边的比较,再和14做逻辑或运算。而非零整数在PHP中会被视为布尔值true,所以不管$row['rank_code']的值是什么,14本身就是true,整个条件表达式的结果永远是true,自然会直接进入第一个home_1的跳转分支。
其他elseif里的or写法也犯了同样的错误,所以只有第一个分支会被触发。
修正后的代码写法
有两种常见的正确写法可以解决这个问题:
写法1:完整的多条件比较(用||替代or更推荐,优先级更高)
if($row['rank_code'] == 13 || $row['rank_code'] == 14) { //管理员面板 header("location:home_1"); $_SESSION["hname"] = $hname; exit(); } elseif($row['rank_code'] == 7 || $row['rank_code'] == 8 || $row['rank_code'] == 9 || $row['rank_code'] == 10 || $row['rank_code'] == 11 || $row['rank_code'] == 12) { //高级面板 header("location:home_2"); $_SESSION["hname"] = $hname; exit(); } elseif($row['rank_code'] == 0 || $row['rank_code'] == 1 || $row['rank_code'] == 2 || $row['rank_code'] == 3 || $row['rank_code'] == 4 || $row['rank_code'] == 5 || $row['rank_code'] == 6) { //初级面板 header("location:home_3"); $_SESSION["hname"] = $hname; exit(); }
注意:这里把
"$hname"改成了$hname,因为直接赋值变量不需要加引号,加引号反而会把变量名当字符串处理(除非你是想做字符串拼接,但这里没必要)。
写法2:用in_array()简化多条件判断(更简洁易维护)
如果判断的是连续或离散的多个值,用in_array()会让代码更清晰:
$rank = $row['rank_code']; if(in_array($rank, [13,14])) { //管理员面板 header("location:home_1"); $_SESSION["hname"] = $hname; exit(); } elseif(in_array($rank, [7,8,9,10,11,12])) { //高级面板 header("location:home_2"); $_SESSION["hname"] = $hname; exit(); } elseif(in_array($rank, range(0,6))) { //初级面板,用range生成0-6的数组 header("location:home_3"); $_SESSION["hname"] = $hname; exit(); }
这种写法尤其适合判断多个值的场景,后期修改或新增rank_code时更方便。
内容的提问来源于stack exchange,提问作者itsrankit
相关产品推荐
相关产品推荐

