You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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) {
        // 原循环内的代码保持不变
    }
}

说明

  1. isset($nicks[$channel]):检查$nicks数组中是否存在$channel这个键,避免未定义索引的问题
  2. is_array($nicks[$channel]):确保该键对应的值是数组类型,保证foreach可以正常遍历
  3. 只有同时满足两个条件时才执行循环,彻底消除警告

另外建议将代码中所有的isSet()改为规范的小写isset(),PHP函数名不区分大小写,但统一写法能提升代码可读性。

内容的提问来源于stack exchange,提问作者Fdcarvalho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 03:48:09