Pg num rows: примеры (PHP)

Использование pg_num_rows для подсчета строк в PHP
Раздел: Базы данных (PostgreSQL)
pg_num_rows(PgSql\Result $result): int

Функция pg_num_rows в PHP

Функция pg_num_rows используется для определения количества строк в результате запроса PostgreSQL. Она применяется после выполнения запросов SELECT, SHOW, DESCRIBE или EXPLAIN для оценки объема возвращенных данных.

Аргументы функции

Функция принимает один обязательный параметр:

  • $result (ресурс) — ресурс результата запроса, возвращаемый функциями pg_query(), pg_query_params() или pg_execute().

Возвращает целое число строк в результате или 0, если строк нет. В случае ошибки возвращает -1.

Примеры использования pg_num_rows

Базовый пример с SELECT
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT * FROM users WHERE active = true");
$row_count = pg_num_rows($result);
echo "Найдено записей: " . $row_count;
Найдено записей: 42
Проверка пустого результата
$result = pg_query($conn, "SELECT * FROM users WHERE id = 9999");
if (pg_num_rows($result) === 0) {
    echo "Запись не найдена";
}
Запись не найдена
Обработка ошибки запроса
$result = pg_query($conn, "SELECT FROM invalid_syntax");
if ($result === false) {
    echo "Ошибка запроса";
} else {
    echo "Строк: " . pg_num_rows($result);
}
Ошибка запроса

Похожие функции в PHP

Возвращает количество измененных строк операторами INSERT, UPDATE, DELETE. Не используется для подсчета строк в выборке.

pg_fetch_row с подсчетом

Альтернативный метод подсчета через цикл:

$count = 0;
while ($row = pg_fetch_row($result)) {
    $count++;
}
// Сброс указателя результата
pg_result_seek($result, 0);
SQL-функция COUNT

Предпочтительнее для больших таблиц, так как работает на стороне СУБД:

$result = pg_query($conn, "SELECT COUNT(*) FROM users");
$count = pg_fetch_result($result, 0, 0);

Аналоги в других языках

Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test")
cur = conn.cursor()
cur.execute("SELECT * FROM users")
row_count = cur.rowcount  # Может возвращать -1 до выборки
print(row_count)
JavaScript (Node.js с pg)
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT * FROM users');
console.log(res.rowCount); // Доступно сразу
MySQL (PHP)
// Вместо pg_num_rows используется mysqli_num_rows
$result = $mysqli->query("SELECT * FROM users");
$row_count = $result->num_rows;

Типичные ошибки

Передача неверного типа аргумента
$count = pg_num_rows("not a resource");
var_dump($count);
bool(false)
Использование для не-SELECT запросов
$result = pg_query($conn, "UPDATE users SET active = true");
$rows = pg_num_rows($result);
echo $rows;
0
Попытка использования после освобождения результата
$result = pg_query($conn, "SELECT * FROM users");
pg_free_result($result);
$rows = pg_num_rows($result);
Warning: pg_num_rows() expects parameter 1 to be resource, bool given

Изменения в версиях PHP

Функция pg_num_rows стабильна и не претерпевала значимых изменений с PHP 4.2.0. В PHP 8.0:

  • Усилена типизация — при некорректном ресурсе возвращается false вместо неопределенного поведения.
  • Удалена поддержка устаревших псевдонимов типа pg_numrows().

Расширенные примеры

Использование с прокручиваемыми курсорами
Пример php
$conn = pg_connect("...");
pg_query($conn, "DECLARE cur SCROLL CURSOR FOR SELECT * FROM large_table");
$result = pg_query($conn, "FETCH ALL IN cur");
$total = pg_num_rows($result);
echo "Всего строк в курсоре: " . $total;
Всего строк в курсоре: 10500
Сравнение с pg_affected_rows
Пример php
// Для INSERT
$result = pg_query($conn, "INSERT INTO logs (message) VALUES ('test'), ('test2')");
echo "Добавлено строк: " . pg_affected_rows($result); // 2
echo "pg_num_rows: " . pg_num_rows($result); // 0
Добавлено строк: 2
pg_num_rows: 0
Работа с асинхронными запросами
Пример php
$conn = pg_connect("...", PGSQL_CONNECT_ASYNC);
$result = pg_query($conn, "SELECT * FROM users");
while (pg_connection_busy($conn)) { usleep(1000); }
$rows = pg_num_rows($result);
echo "Асинхронно получено строк: " . $rows;
Использование в пагинации
Пример php
$page = 2;
$per_page = 10;
$result = pg_query($conn, "SELECT * FROM products ORDER BY id");
$total = pg_num_rows($result);
$pages = ceil($total / $per_page);
pg_result_seek($result, ($page-1) * $per_page);
for ($i=0; $i<$per_page; $i++) {
    $row = pg_fetch_assoc($result);
    if (!$row) break;
    print_r($row);
}

PHP pg_num_rows function comments

En
Pg num rows Returns the number of rows in a result