pg_affected_rows

(PHP 4 >= 4.2.0,PHP 5,PHP 7,PHP 8)

pg_affected_rows返回受影响的记录(元组)数量

描述

pg_affected_rows(PgSql\Result $result): int

pg_affected_rows() 返回受 INSERTUPDATEDELETE 查询影响的元组(实例/记录/行)数量。

从 PostgreSQL 9.0 及更高版本开始,服务器返回 SELECT 到的行数。旧的 PostgreSQL 对 SELECT 返回 0。

注意:

此函数以前称为 pg_cmdtuples()

参数

result

pg_query()pg_query_params()pg_execute()(以及其他)返回的 PgSql\Result 实例。

返回值

查询影响的行数。如果没有任何元组受影响,它将返回 0

变更日志

版本 描述
8.1.0 result 参数现在期望一个 PgSql\Result 实例;以前,期望的是一个 资源

示例

示例 #1 pg_affected_rows() 示例

<?php
$result
= pg_query($conn, "INSERT INTO authors VALUES ('Orwell', 2002, 'Animal Farm')");

$cmdtuples = pg_affected_rows($result);

echo
$cmdtuples . " tuples are affected.\n";
?>

上面的示例将输出

1 tuples are affected.

参见

  • pg_query() - 执行查询
  • pg_query_params() - 将命令提交到服务器并等待结果,能够将参数与 SQL 命令文本分开传递
  • pg_execute() - 发送请求以使用给定参数执行准备好的语句,并等待结果
  • pg_num_rows() - 返回结果中的行数

添加注释

用户贡献的注释 5 个注释

匿名
16 年前
pg-affected-rows () 仅在执行的最后一个 SQL 语句上运行。如果你将多个语句组合在一起,那么 pg_affected_rows 可能不会返回你期望的值。

例如

<?php

$result
= pg_query ('BEGIN; INSERT INTO foo (bar) VALUES (\'baz\'; COMMIT');

echo (
pg_affected_rows ($result));

?>

将导致打印 0,因为 Postgres 执行的最后一个语句是 COMMIT,它不影响任何行。

我还没有尝试过,所以不能确定它是否有效,但如果你将查询拆分,你应该能够获得所需的行数。

例如

<?php

$result
= pg_query ('BEGIN; INSERT INTO foo (bar) VALUES (\'baz\';');

echo (
pg_affected_rows ($result));

pg_query ('COMMIT;');
?>

应该允许你获得上一个查询影响的行数。但是,我还没有尝试过,所以不要依赖它。
Bruno Baguette
19 年前
请注意,当你提交多个 SQL 查询(在一个 BEGIN;COMMIT; 中,例如这样)

$SQLQuery = 'BEGIN;';
$SQLQuery.= 'INSERT INTO a (a,b) VALUES (1,2);';
$SQLQuery.= 'INSERT INTO b (ref_b,c) VALUES (2,5);';
$SQLQuery.= 'COMMIT;';

$HandleResults = pg_query($SQLQuery);
echo(pg_affected_rows($HandleResults));

pg_affected_rows() 将返回 0
匿名
16 年前
有一个叫做自动提交的东西,当你提供多个用 ; 分号分隔的查询时,如果其中一个失败,则执行所有或无操作。在执行一个查询时,不需要 BEGIN;COMMIT;ROLLBACK。它的逻辑对我来说是 pg_affected_rows() 返回受影响的行,如果你想执行两个独立的查询,那么先执行 BEGIN,然后执行 1 并获取 pg_affected_rows(),然后执行 2 并获取 pg_affected_rows(),最后执行 COMMIT;。
匿名
19 年前
这并不完全正确,我已经能够很好地在一个调用中执行多个查询。相反,它与这个函数返回最后一个执行查询的受影响行有关,而不是单个 pg_query 调用指定的最后一组查询。
匿名
19 年前
关于 Bruno Baguette 的注释

pg_query 函数一次只能执行一个查询。当你执行你的
$sql="BEGIN;
INSERT ...
COMMIT;";
$result=pg_query($conn,$sql);
echo pg_affected_rows($result);

你将得到一个零,因为只有 BEGIN; 被执行。

我相信,每次调用一个查询是 PHP 内置的防止 SQL 注入攻击的保护措施。(即有人提交一个字符串参数,该参数会结束当前查询并追加另一个查询)
To Top