Pg result status: примеры (PHP)
pg_result_status(PgSql\Result $result, int $mode = PGSQL_STATUS_LONG): string|intФункция pg_result_status в PHP предназначена для получения статуса выполнения запроса к базе данных PostgreSQL. Эта функция используется после выполнения запросов через функции pg_query, pg_query_params или pg_execute для определения результата операции.
- $result (обязательный) - ресурс результата запроса PostgreSQL, возвращаемый функциями выполнения запросов.
- $result_type (опциональный) - константа, определяющая формат возвращаемого статуса:
PGSQL_STATUS_LONG- возвращает числовой код статуса (по умолчанию)PGSQL_STATUS_STRING- возвращает строковое представление статуса
Функция позволяет определить, был ли запрос выполнен успешно, сколько строк затронуто, а также получить информацию о типе выполненной команды.
Проверка статуса SELECT запроса:
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT * FROM users");
$status = pg_result_status($result);
echo "Статус: " . $status; // Обычно вернет PGSQL_TUPLES_OK (2)
?>Статус: 2
<?php
$result = pg_query($conn, "INSERT INTO users(name) VALUES ('Иван')");
$status = pg_result_status($result, PGSQL_STATUS_STRING);
echo "Статус: " . $status;
?>Статус: PGSQL_COMMAND_OK
<?php
$result = pg_query($conn, "UPDATE users SET active = true WHERE id = 1");
$status = pg_result_status($result);
if ($status === PGSQL_COMMAND_OK) {
echo "Команда выполнена успешно";
}
?>Команда выполнена успешно
- pg_affected_rows - возвращает количество затронутых запросом строк. Предпочтительнее использовать для INSERT, UPDATE, DELETE операций.
- pg_last_error - получает последнее сообщение об ошибке на подключении. Используется для диагностики проблем.
- pg_result_error - возвращает сообщение об ошибке, связанное с конкретным результатом запроса.
- pg_num_rows - определяет количество строк в результате SELECT запроса.
Функция pg_result_status более универсальна и предоставляет информацию о типе выполненной операции, тогда как специализированные функции дают конкретные данные о результате.
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT * FROM users")
print(cur.statusmessage) # Аналог pg_result_statusSELECT 10
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT * FROM users');
console.log(res.command); // 'SELECT'
console.log(res.rowCount); // количество строкSELECT 10
Pg result status в MySQL
// В mysqli
$mysqli = new mysqli("localhost", "user", "pass", "test");
$result = $mysqli->query("SELECT * FROM users");
// Аналога pg_result_status нет, используется
// $mysqli->info для информации о последнем запросе
// $mysqli->affected_rows для количества строк<?php
$status = pg_result_status(false);
var_dump($status);
?>bool(false)
<?php
$conn = pg_connect("host=localhost dbname=test");
$result = pg_query($conn, "SELECT * FROM users");
pg_close($conn);
$status = pg_result_status($result); // Может вызвать предупреждение
?><?php
$result = pg_query($conn, "SELECT * FROM несуществующая_таблица");
$status = pg_result_status($result);
if ($status === PGSQL_COMMAND_OK) { // Это условие не выполнится
echo "Успех";
} else {
echo "Статус ошибки: " . $status;
}
?>Статус ошибки: 7 (PGSQL_FATAL_ERROR)
В PHP 8.0 функция pg_result_status не претерпела значительных изменений, но была улучшена обработка типов аргументов. В более ранних версиях PHP (до 7.4) функция могла возвращать различные значения при некорректных аргументах. Начиная с PHP 8.0, при передаче неверного типа аргумента выбрасывается TypeError.
В PHP 8.1 были добавлены предупреждения о устаревших методах работы с ресурсами, но сама функция осталась неизменной. Рекомендуется использовать объектно-ориентированный стиль с PDO для новых проектов.
<?php
$conn = pg_connect("host=localhost");
$result = pg_query($conn, "\n WITH RECURSIVE t(n) AS (\n VALUES (1)\n UNION ALL\n SELECT n+1 FROM t WHERE n < 1000000\n )\n SELECT SUM(n) FROM t");
$status = pg_result_status($result, PGSQL_STATUS_STRING);
$rows = pg_affected_rows($result);
echo "Статус: {$status}, Затронуто строк: {$rows}";
?>Статус: PGSQL_TUPLES_OK, Затронуто строк: 1
<?php
$result = pg_query($conn, "COPY users TO STDOUT WITH CSV");
$status = pg_result_status($result);
if ($status === PGSQL_COPY_OUT) {
echo "Начата операция выгрузки данных\n";
while ($row = pg_fetch_row($result)) {
echo implode(',', $row) . "\n";
}
}
?><?php
function get_command_type($result) {
$status = pg_result_status($result, PGSQL_STATUS_STRING);
$command_types = [
'PGSQL_EMPTY_QUERY' => 'empty',
'PGSQL_COMMAND_OK' => 'write',
'PGSQL_TUPLES_OK' => 'read',
'PGSQL_COPY_OUT' => 'copy_out',
'PGSQL_COPY_IN' => 'copy_in'
];
return $command_types[$status] ?? 'unknown';
}
$queries = [
"SELECT 1",
"INSERT INTO logs(message) VALUES ('test')",
"COPY users FROM STDIN"
];
foreach ($queries as $query) {
$result = pg_query($conn, $query);
echo get_command_type($result) . "\n";
}
?>read write copy_in
<?php
function execute_safe($conn, $query) {
$result = pg_query($conn, $query);
if (!$result) {
return ['success' => false, 'error' => pg_last_error($conn)];
}
$status_num = pg_result_status($result);
$status_str = pg_result_status($result, PGSQL_STATUS_STRING);
$response = [
'success' => $status_num <= PGSQL_TUPLES_OK,
'status_code' => $status_num,
'status_text' => $status_str,
'affected_rows' => pg_affected_rows($result)
];
if ($status_num === PGSQL_TUPLES_OK) {
$response['data'] = pg_fetch_all($result);
}
return $response;
}
$result = execute_safe($conn, "DELETE FROM users WHERE id = 999");
print_r($result);
?>Array
(
[success] => 1
[status_code] => 1
[status_text] => PGSQL_COMMAND_OK
[affected_rows] => 0
)