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

PHP中FetchArray返回false导致foreach无法执行的问题排查

解决oci_fetch_array返回false导致foreach无法执行的问题

问题核心:你用的oci_fetch_array(也就是你的FetchArray方法)是逐行读取结果集的函数——每次调用只返回当前行的数据,当结果集为空或者所有行都读取完毕时,它会返回false。

你之前直接把$database->FetchArray()放进foreach里,逻辑完全错了:

  • 如果结果集有数据,foreach会遍历这第一行的字段键值对(比如$row会依次是ID_WORKSPACE_USERS的值、LOGIN_WORKSPACE_USERS的值),根本不是你想要的整行数据;
  • 如果结果集为空,FetchArray()返回false,foreach直接报错,循环根本跑不起来。

修正方案:改用while循环逐行读取

把原来的foreach换成while循环,反复调用FetchArray()直到返回false:

public static function FindBasicRecipients(): array|bool
{
    $database = new Database('log', 'pwd', 'desc');
    $database->Connect();
    $database->Parse("SELECT 
        ID_WORKSPACE_USERS,
        LOGIN_WORKSPACE_USERS
        FROM WORKSPACE_USERS
        WHERE FONCTION_WORKSPACE_USERS IN ('Job 1','Job 2', 'Job 3')
        ORDER BY EMAIL_WORKSPACE_USERS"
    );
    $success = $database->Execute();
    if ($success) {
        $basicRecipients = [];
        // 用while循环逐行读取,直到FetchArray返回false
        while ($row = $database->FetchArray()) {
            $basicRecipients[] = new User(
                $row['ID_WORKSPACE_USERS'],
                $row['LOGIN_WORKSPACE_USERS']
            );
        }
        $database->FreeStatement();
        $database->Close();
        return $basicRecipients;
    } else {
        $database->FreeStatement();
        $database->Close();
        return false;
    }
}

额外优化:指定FetchArray返回关联数组

默认情况下oci_fetch_array会同时返回关联数组和索引数组,你可以给FetchArray方法指定默认模式为OCI_ASSOC,确保只返回以字段名为键的关联数组,避免索引干扰:

public function FetchArray($mode = OCI_ASSOC): array|false
{
    return oci_fetch_array($this->statement, $mode);
}

这样能保证$row里的键都是你SQL里的字段名,不会出现数字索引的情况,更符合你的代码逻辑。

内容的提问来源于stack exchange,提问作者vh-dev-web

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:05:32