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
相关产品推荐
相关产品推荐

