PHP 7.4.0RC6 Released!


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

pg_affected_rows Retourne le nombre de lignes affectées


pg_affected_rows ( resource $result ) : int

pg_affected_rows() retourne le nombre de lignes affectées par les requêtes de type INSERT, UPDATE et DELETE.

Depuis PostgreSQL 9.0 et suivants, le serveur retourne le nombre de lignes sélectionnées. Pour les versions antérieures, PostgreSQL retourne 0 pour les SELECT.


Auparavant, cette fonction s'appelait pg_cmdtuples().

Liste de paramètres


Ressource de résultat de requête PostgreSQL, retourné par pg_query(), pg_query_params() ou pg_execute() (entre autres).

Valeurs de retour

Le nombre de lignes affectées par la requête. S'il n'y a pas de ligne affecté, la fonction retournera 0.


Exemple #1 Exemple avec pg_affected_rows()

pg_query($conn"INSERT INTO editeur VALUES ('Auteur')");

$cmdtuples pg_affected_rows($result);

$cmdtuples " lignes ont été affectées.\n";

L'exemple ci-dessus va afficher :

1 lignes ont été affectées.

Voir aussi

  • pg_query() - Exécute une requête PostgreSQL
  • pg_query_params() - Envoie une commande au serveur et attend le résultat, avec les capacités de passer des paramètres séparément de la commande texte SQL
  • pg_execute() - Exécute une requête préparée PostGreSQL
  • pg_num_rows() - Retourne le nombre de lignes PostgreSQL

add a note add a note

User Contributed Notes 5 notes

12 years ago
pg-affected-rows () only runs on the LAST SQL STATEMENT executed.  If you compound several statements together then pg_affected_rows might not return what you expect. 

For example:


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

echo (
pg_affected_rows ($result));


will cause 0 to be printed, because the last statement executed by Postgres was COMMIT, which doesn't affect any rows. 

I haven't tried this so am not certain it works, but you SHOULD be able to get the row counts you want if you split your queries up. 

For example:


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

echo (
pg_affected_rows ($result));

pg_query ('COMMIT;');

should allow you to get the number of rows affected by the previous query.  I haven't tried this yet though, so don't count on it.
11 years ago
There is something called auto-commit, when you supply more than one query delimited by ; semicolon all-or-none is done if one fails. No need for BEGIN;COMMIT;ROLLBACK when doing one query. its logic to mee pg_affected_rows() returns affected rows and if you want to do 2 queries apart from each other.. do a BEGIN and then 1 and get pg_affected_rows() then do 2 and get pg_affected_rows() and then finally do COMMIT;
Bruno Baguette
14 years ago
Note that when you submit several SQL queries, within one BEGIN;COMMIT; like this one :

$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);

pg_affected_rows() will return 0
14 years ago
That's not quite true, I've been able to execute multiple queries in a single call just fine. In stead, it has to do with the fact this function returns the affected rows for the last executed query, not the last set of queries specified to a single call to pg_query.
14 years ago
Concering Bruno Baguette's note:

The pg_query function only allows one query per function call.  When you do your
echo pg_affected_rows($result);

you get a zero, because only the BEGIN; is executed.

The single query per call is, I beleive, a PHP builtin protection against SQL injection attacks.  (Ie someone submitting a string paramter that ends the current query and appends another one)
To Top