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

PHP根据下拉框选择获取数据库数据及count错误排查

解决PHP count() 参数必须是可数类型的错误

首先,咱们来定位你遇到的PHP Warning: count(): Parameter must be an array or an object that implements Countable错误的根源:

你的Queries::getftf()方法中使用了oci_fetch_array(),这个函数仅返回查询结果集中的单行数据(如果有结果),如果查询无结果或者执行失败,它会返回false。当你把这个单行数组(或false)传给count()时,就会触发警告——因为count()只能处理数组或可数对象,而单行数组虽然能被count,但你的逻辑是要判断是否有多个结果,显然用错了获取结果的方式。


解决方案:修改getftf()方法获取所有结果行

你需要把查询到的所有行都存入一个数组返回,而不是只取一行。这里提供两种可靠的实现方式:

方式1:使用oci_fetch_all()一次性获取所有结果

class Queries {
    public static function getftf() {
        $dbUser = "xxxx";
        $dbPass = "xxxx";
        $dbConn = "(DESCRIPTION = (ADDRESS = (PROTOCOL=TCP)(HOST=xxxx)(PORT=1521))(CONNECT_DATA=(SID=xxxx)))";
        $conn = oci_connect($dbUser, $dbPass, $dbConn);
        
        // 先检查数据库连接是否成功
        if (!$conn) {
            $e = oci_error();
            trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
            return []; // 返回空数组避免后续报错
        }

        $sql = oci_parse($conn,"SELECT * from tblFTF_Archive_Page1 ");
        if (oci_execute($sql, OCI_DEFAULT)){
            $result = [];
            // OCI_FETCHSTATEMENT_BY_ROW 让结果以行数组的形式返回
            oci_fetch_all($sql, $result, 0, -1, OCI_FETCHSTATEMENT_BY_ROW);
            
            // 释放资源并关闭连接
            oci_free_statement($sql);
            oci_close($conn);
            
            return $result;
        } else {
            $e = oci_error($sql);
            trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
            return [];
        }
    }
}

方式2:用循环遍历获取每一行数据

如果你更习惯逐行处理结果,可以用oci_fetch_array()配合循环:

class Queries {
    public static function getftf() {
        $dbUser = "xxxx";
        $dbPass = "xxxx";
        $dbConn = "(DESCRIPTION = (ADDRESS = (PROTOCOL=TCP)(HOST=xxxx)(PORT=1521))(CONNECT_DATA=(SID=xxxx)))";
        $conn = oci_connect($dbUser, $dbPass, $dbConn);
        
        if (!$conn) {
            $e = oci_error();
            trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
            return [];
        }

        $sql = oci_parse($conn,"SELECT * from tblFTF_Archive_Page1 ");
        $result = [];
        
        if (oci_execute($sql, OCI_DEFAULT)){
            // 循环读取每一行,存入结果数组
            while ($row = oci_fetch_array($sql, OCI_ASSOC+OCI_RETURN_NULLS)) {
                $result[] = $row;
            }
            
            oci_free_statement($sql);
            oci_close($conn);
            
            return $result;
        } else {
            $e = oci_error($sql);
            trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
            return [];
        }
    }
}

同时修复前端输出的问题

原输出代码存在两个小问题:HTML标签不完整(缺少<td>和开头的<tr>),以及循环中重复使用同一个id(id必须唯一)。修改后的代码如下:

<?php 
$report = $getschool->getftf(); 
if (empty($report)) { 
    echo "<tr><td>No Reports</td></tr>"; 
} else { 
    foreach ($report as $item) { 
        echo "<tr><td><a class='btn recallFTF' href='createftf.php?id=" . htmlspecialchars($item['ID']) . "'>Create FTF</a></td></tr>"; 
    } 
} 
?>

这里做了几点优化:

  • 用empty()代替count() === 0,更安全且语义更清晰;
  • 改用foreach循环遍历结果数组,避免依赖count();
  • 添加htmlspecialchars()防止XSS注入;
  • 把重复的id='recallFTF'改成class='recallFTF',符合HTML规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:38:11