如何修复sqlsrv_num_rows()参数为布尔值而非资源的警告?
修复
sqlsrv_num_rows() expects parameter 1 to be resource, boolean given警告的方案 这个警告的核心原因很明确:你的sqlsrv_query()执行失败了,返回了布尔值false(而不是预期的结果集资源),当你把这个false传给sqlsrv_num_rows()时,就触发了类型不匹配的警告。下面是具体的修复步骤:
1. 先检查查询执行结果,避免直接使用无效的返回值
在调用sqlsrv_num_rows()之前,必须先判断sqlsrv_query()是否成功执行。如果失败,先捕获错误信息,这能帮你快速定位问题根源。修改你的代码片段如下:
$results = sqlsrv_query($dbconn, $query2, array(), array('Scrollable' => 'static')); // 先检查查询是否成功执行 if ($results === false) { // 获取详细的SQL错误信息,用于调试 $errors = sqlsrv_errors(); foreach ($errors as $error) { echo "SQL执行错误: " . $error['message']; echo "错误代码: " . $error['code']; } // 可以根据业务需求终止脚本或做降级处理 exit; } // 确认结果集有效后,再调用sqlsrv_num_rows() if (sqlsrv_num_rows($results) >= 2) { // 你的UPDATE逻辑(注意这里也要检查后续SQL的合法性) $query3 = "UPDATE ClanDb.dbo.CL SET RegiDate = '$today', Cpoint = (SELECT SUM(Point) FROM SodDb.dbo.Sod2Clan$yyMM WHERE ...)"; // 同样要检查$query3的执行结果 $updateResult = sqlsrv_query($dbconn, $query3); if ($updateResult === false) { // 处理更新错误 } }
2. 排查$query2本身的语法问题
sqlsrv_query()返回false绝大多数情况是SQL语句有问题,结合你提供的代码片段,重点检查这几点:
- 你的
$query2语句是不完整的(末尾有截断),这肯定会导致SQL语法错误,先补全并验证SQL的正确性 - 动态表名
Sod2Clan$yyMM:确保变量$yyMM已经正确赋值(比如格式为202405这类合法的年月字符串),且对应的表确实存在于数据库中 - 检查SQL语句中的括号、逗号、字段名/表名拼写是否正确,比如是否有遗漏的闭合括号
3. 额外注意:规避SQL注入风险
你的代码中直接将$today和动态表名拼接到SQL语句中,存在严重的SQL注入风险。建议:
- 对于
$today这类参数,使用参数化查询替代直接拼接:// 示例:参数化UPDATE语句中的RegiDate $query3 = "UPDATE ClanDb.dbo.CL SET RegiDate = ?, Cpoint = (SELECT SUM(Point) FROM SodDb.dbo.Sod2Clan$yyMM WHERE ...)"; $params = array($today); $updateResult = sqlsrv_query($dbconn, $query3, $params); - 对于动态表名,无法用参数化查询,建议做白名单验证,确保
$yyMM对应的表名是合法存在的,比如:// 生成合法的表名列表(可根据业务动态生成) $validTables = array("Sod2Clan202404", "Sod2Clan202405", "Sod2Clan202406"); $targetTable = "Sod2Clan$yyMM"; if (!in_array($targetTable, $validTables)) { die("非法的表名请求"); } // 再将$targetTable拼接到SQL中
内容的提问来源于stack exchange,提问作者puka Pukay
相关产品推荐
相关产品推荐

