CentOS升级PHP/MySQL后IRC机器人出现foreach参数无效警告
解决PHP升级后IRC机器人的foreach警告问题
问题情况
升级CentOS系统的PHP和MySQL至最新版本后,IRC PHP机器人出现如下警告:
PHP Warning: Invalid argument supplied for foreach() in stats.functions.php on line 71
触发警告的第71行代码为:
foreach (isSet($nicks[$channel]) as $name => $value)
相关代码片段:
try { global $db, $listas, $nicks, $channels, $time; $timeinc = time() - $time["inc"]; $time["inc"] = time(); $split = explode(",",$channels); foreach ($split as $channel) { if (!isset($channel)) { continue; } if ($channel == "#pthelp") { foreach (isSet($nicks[$channel]) as $name => $value) { if (!isset($value) || strlen(trim($value)) < 1) { continue; } $user = strtolower(addslashes($value)); $nivel = checklevel($user); $membrorank = checkmembro($user); if ($nivel != "none" && $nivel != "Suspenso") { $datames = date("n"); $dataano = date("Y"); // Rank Stats if ($membrorank == 1 OR isSet($listas['candidatos'][$user])) { $in_rank = $db->get_row("SELECT tempo FROM membros_rankstats WHERE nick='". $user ."' AND mes='". $datames ."' AND ano='". $dataano ."'"); if ($in_rank) { $temporank = $in_rank->tempo + $timeinc; if (isSet($listas['candidatos'][$user])) { $db->query("UPDATE
问题原因
isSet()(规范写法为isset())函数返回的是布尔值(true或false),而foreach循环仅能遍历数组或可遍历对象。直接将布尔值传入foreach,就会触发"Invalid argument supplied for foreach()"警告。
这段代码的真实逻辑应该是:先检查$nicks[$channel]是否存在,若存在则遍历该数组,而非遍历isset()的返回值。
修复方案
将第71行的错误写法,修改为先判断再遍历的逻辑:
if (isset($nicks[$channel]) && is_array($nicks[$channel])) { foreach ($nicks[$channel] as $name => $value) { // 原循环内的代码保持不变 } }
说明
isset($nicks[$channel]):检查$nicks数组中是否存在$channel这个键,避免未定义索引的问题is_array($nicks[$channel]):确保该键对应的值是数组类型,保证foreach可以正常遍历- 只有同时满足两个条件时才执行循环,彻底消除警告
另外建议将代码中所有的isSet()改为规范的小写isset(),PHP函数名不区分大小写,但统一写法能提升代码可读性。
内容的提问来源于stack exchange,提问作者Fdcarvalho
相关产品推荐
相关产品推荐

