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

