为何我的PHP函数出现pg_execute与pg_num_rows参数错误?
解决pg_execute和pg_num_rows的参数错误
错误根源
pg_execute()参数错误:你把pg_prepare()的返回值(布尔值)传给了pg_execute的第二个参数,但pg_execute需要的是准备语句的名称字符串(也就是你定义的"display_calls"),传值错误导致参数类型不匹配。pg_num_rows()报错是因为前面pg_execute执行失败返回了null,传入无效参数触发报错。- 额外问题:
pg_fetch_result里用的字段名和SQL查询的字段名不匹配,会导致取不到数据。
修复步骤及代码
- 修正pg_execute的参数:直接用准备语句的名称字符串
"display_calls",而非$display_calls变量(这个变量存的是pg_prepare的执行结果,不是语句名)。 - 匹配字段名:SQL查询的是
firstName、lastName、callDate,pg_fetch_result里要对应这些字段名,不能用自定义的别名。 - 移除无效代码:
return $output;之后的echo $output;永远不会执行,直接删除。 - 添加错误处理:检查
pg_prepare和pg_execute的执行结果,避免后续函数因无效值报错。
修复后的完整代码:
// 预处理SQL语句,$prepare_success存的是执行结果(true/false),无需在函数中调用 $prepare_success = pg_prepare($conn, "display_calls", "SELECT clients.firstName, clients.lastName, callLogs.callDate FROM clients INNER JOIN callLogs ON clients.id=callLogs.Clients_id"); // 检查预处理是否成功 if (!$prepare_success) { die("预处理语句失败: " . pg_last_error($conn)); } function display_logs() { global $conn; $output = ""; // 调用pg_execute,第二个参数是准备语句名称,第三个参数为绑定参数(无参数则传空数组) $result = pg_execute($conn, "display_calls", []); // 检查查询执行是否成功 if (!$result) { die("执行查询失败: " . pg_last_error($conn)); } $records = pg_num_rows($result); for($i = 0; $i < $records; $i++){ $output .= " <tr> <td>".pg_fetch_result($result, $i, "firstName")."</td>"; $output .= " <td>".pg_fetch_result($result, $i, "lastName")."</td>"; $output .= " <td>".pg_fetch_result($result, $i, "callDate")."</td> </tr>"; } return $output; }
额外说明
pg_prepare()的返回值是布尔值(成功返回true,失败返回false),不是语句资源,所以不需要把它传给pg_execute,pg_execute只需要知道语句的名称字符串。- 如果SQL需要绑定参数(比如
SELECT ... WHERE id = $1),pg_execute的第三个参数就是[$id]这样的数组,用来替换占位符。 - 全局变量
$conn的使用可以改成参数传递,让代码更健壮,避免依赖全局变量。
内容的提问来源于stack exchange,提问作者OGanunobyfan1629
相关产品推荐
相关产品推荐

