Pg affected rows: примеры (PHP)
pg_affected_rows(PgSql\Result $result): intФункция pg_affected_rows в PHP возвращает количество строк, затронутых последним запросом (INSERT, UPDATE, DELETE) через указанное соединение с базой данных PostgreSQL.
Использование функции актуально после выполнения SQL-запросов, которые модифицируют данные. Она позволяет узнать, сколько строк было вставлено, обновлено или удалено, что полезно для логирования, проверки успешности операции или условной логики в приложении.
Функция принимает один обязательный аргумент:
- $result (ресурс PgSql\Result): Результат запроса, возвращенный функциями
pg_query(),pg_send_query()и другими. В PHP 8.0+ тип стал объектомPgSql\Result.
Примеры демонстрируют основное использование.
<?php
$conn = pg_connect("host=localhost dbname=test");
$query = "UPDATE users SET status = 'active' WHERE last_login > '2023-01-01'";
$result = pg_query($conn, $query);
$count = pg_affected_rows($result);
echo "Обновлено строк: " . $count;
?>Обновлено строк: 15
<?php
$result = pg_query($conn, "INSERT INTO logs (message) VALUES ('test1'), ('test2'), ('test3')");
echo pg_affected_rows($result); // Выведет количество вставленных строк
?>3
<?php
// UPDATE, который не затронул ни одной строки
$result = pg_query($conn, "UPDATE users SET status = 'active' WHERE id = -1");
echo pg_affected_rows($result);
?>0
В PHP для PostgreSQL существуют и другие функции для получения информации о результате запроса.
Функция pg_num_rows возвращает количество строк в результате SELECT. Применяется только для запросов, возвращающих наборы данных, в отличие от pg_affected_rows, которая работает с модифицирующими запросами.
rowCount объекта PDOПри использовании расширения PDO метод rowCount() объекта PDOStatement выполняет аналогичную роль для разных СУБД, включая PostgreSQL. Это более универсальный подход в кроссплатформенных проектах.
В других языках и СУБД существуют похожие механизмы.
import psycopg2
conn = psycopg2.connect("dbname=test")
cur = conn.cursor()
cur.execute("DELETE FROM items WHERE category = 'old'")
print(cur.rowcount) # Аналог pg_affected_rows7
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query("UPDATE posts SET views = views + 1 WHERE id = 5");
console.log(res.rowCount); // Количество затронутых строк1
В MySQL для PHP используется функция mysqli_affected_rows, которая концептуально идентична, но работает с MySQL соединением.
<?php
$mysqli = new mysqli("localhost", "user", "pass", "test");
$mysqli->query("DELETE FROM logs");
echo $mysqli->affected_rows;
?>42
Частые ошибки связаны с непониманием контекста применения.
<?php
$result = pg_query($conn, "SELECT * FROM users");
$count = pg_affected_rows($result);
echo $count;
?>0
Для SELECT pg_affected_rows всегда вернет 0. Для подсчета строк в выборке нужна pg_num_rows.
<?php
$count = pg_affected_rows(false); // Передача неверного аргумента
?>Warning: pg_affected_rows() expects parameter 1 to be PgSql\Result, bool givenФункция показывает строки, затронутые конкретным запросом, а не всей транзакцией. Для получения суммарного эффекта нужно суммировать результаты вручную.
В PHP 8.0 произошли значительные изменения в работе с расширением PostgreSQL.
Тип возвращаемого значения pg_query() был изменен с ресурса (resource) на объект PgSql\Result. Функция pg_affected_rows теперь принимает этот объект, но сохраняет обратную совместимость на уровне поведения.
В PHP 8.0 передача аргумента неподдерживаемого типа вызывает исключение TypeError, тогда как в более ранних версиях выдавалось предупреждение (E_WARNING). Это способствует более надежному коду.
Расширенные сценарии демонстрируют нюансы.
<?php
$result = pg_query($conn, "DELETE FROM sessions WHERE expires_at < NOW()");
if ($result === false) {
echo "Ошибка запроса";
} else {
$deleted = pg_affected_rows($result);
if ($deleted > 0) {
echo "Удалено устаревших сессий: $deleted";
} else {
echo "Нет устаревших сессий для очистки";
}
}
?><?php
pg_send_query($conn, "INSERT INTO events (type) VALUES ('login'), ('logout')");
$result = pg_get_result($conn);
if ($result) {
echo "Вставлено записей: " . pg_affected_rows($result);
}
?>Вставлено записей: 2
Даже если запрос использует предложение RETURNING для получения данных, pg_affected_rows возвращает количество измененных строк.
<?php
$result = pg_query($conn,
"UPDATE products SET price = price * 1.1 WHERE category = 'books' RETURNING id, price"
);
$updatedCount = pg_affected_rows($result);
echo "Цена обновлена для $updatedCount товаров";
// При этом из $result можно также получить возвращенные данные
while ($row = pg_fetch_assoc($result)) {
// Обработка строк с новыми ценами
}
?>