Pg fetch row: примеры (PHP)
pg_fetch_row(PgSql\Result $result, ?int $row = null, int $mode = PGSQL_NUM): array|falseОписание функции pg_fetch_row
Функция pg_fetch_row используется в PHP для извлечения строки результата запроса из базы данных PostgreSQL в виде индексированного массива. Каждый элемент массива соответствует значению столбца. Нумерация индексов начинается с 0.
Функция принимает три аргумента:
- $result (обязательный): Ресурс результата запроса, возвращаемый функциями
pg_query,pg_send_queryи другими. - $row (необязательный): Номер извлекаемой строки. Если не указан, функция выбирает следующую доступную строку. Если передано
null, также выбирает следующую строку. - $result_type (необязательный): Влияет на тип возвращаемого значения. Доступны константы:
PGSQL_NUM(по умолчанию, возвращает массив с числовыми индексами),PGSQL_ASSOC(возвращает ассоциативный массив, но для этого лучше использоватьpg_fetch_assoc) иPGSQL_BOTH(возвращает массив с числовыми и строковыми индексами). Дляpg_fetch_rowэтот параметр часто игнорируется, так как функция всегда возвращает числовой массив.
Короткие примеры использования
<?
$connection = pg_connect('host=localhost dbname=test user=postgres');
$result = pg_query($connection, 'SELECT id, name FROM users LIMIT 2');
echo 'Строка 0:\n';
print_r(pg_fetch_row($result)); // Получить первую строку
echo '\nСтрока 1:\n';
print_r(pg_fetch_row($result)); // Получить вторую строку
?>Строка 0:
Array
(
[0] => 1
[1] => Иван
)
Строка 1:
Array
(
[0] => 2
[1] => Мария
)<?
// ... соединение и запрос, как в примере 1
$second_row = pg_fetch_row($result, 1); // Получить строку с индексом 1 (вторая строка)
print_r($second_row);
?>Array
(
[0] => 2
[1] => Мария
)<?
while ($row = pg_fetch_row($result)) {
echo 'ID: ' . $row[0] . ', Имя: ' . $row[1] . "\n";
}
?>ID: 1, Имя: Иван ID: 2, Имя: Мария
Похожие функции в PHP
- pg_fetch_assoc: Возвращает строку как ассоциативный массив, где ключи - имена столбцов. Удобнее для читаемости кода, когда нужен доступ по имени поля.
- pg_fetch_array: Возвращает массив, который по умолчанию содержит и числовые, и строковые индексы. Менее эффективен, чем специализированные функции, если нужен только один тип индексации.
- pg_fetch_object: Возвращает строку как объект. Свойства объекта соответствуют именам столбцов. Предпочтителен в объектно-ориентированном стиле.
- pg_fetch_all: Возвращает массив, содержащий все строки результата. Полезен для небольших наборов данных, которые нужно обработать в памяти.
pg_fetch_row часто используют, когда важен минимальный расход памяти или когда порядок столбцов в запросе фиксирован и известен.
Аналоги в других языках
import psycopg2
conn = psycopg2.connect('host=localhost dbname=test user=postgres')
cur = conn.cursor()
cur.execute('SELECT id, name FROM users LIMIT 2')
row = cur.fetchone() # Получение одной строки как кортежа
print(row) # (1, 'Иван')
rows = cur.fetchall() # Получение всех строк как список кортежей
print(rows) # [(1, 'Иван'), (2, 'Мария')](1, 'Иван') [(1, 'Иван'), (2, 'Мария')]
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id, name FROM users LIMIT 2');
console.log(res.rows[0]); // { id: 1, name: 'Иван' } - объект
console.log(res.rows[1].name); // 'Мария' - доступ по имени поля{ id: 1, name: 'Иван' }
Мария<?
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('SELECT id, name FROM users');
$row = $result->fetch_row(); // Аналог pg_fetch_row
print_r($row);
?>Array
(
[0] => 1
[1] => Иван
)Ключевое отличие: в Python и JavaScript по умолчанию возвращаются структуры (кортеж/объект), близкие к ассоциативному массиву в PHP, а не индексный массив.
Типичные ошибки
<?
$result = pg_query($conn, 'SELECT name FROM users WHERE id=1');
$row = pg_fetch_row($result);
echo $row[1]; // Столбец с индексом 1 не существует, есть только $row[0]
?>Notice: Undefined offset: 1 in ... (пустой вывод или предупреждение)
<?
$result = pg_query($conn, 'SELECT id FROM users WHERE id=1');
$row1 = pg_fetch_row($result); // OK
$row2 = pg_fetch_row($result); // FALSE, так как строк больше нет
var_dump($row2);
?>bool(false)
<?
$conn = pg_connect('...');
$wrong_result = 'not a resource';
$row = pg_fetch_row($wrong_result); // Предупреждение
?>Warning: pg_fetch_row() expects parameter 1 to be resource, string given in ...
Изменения в последних версиях PHP
В PHP 8.1 функция pg_fetch_row теперь возвращает null, если строка не найдена, или если произошла ошибка, в отличие от предыдущих версий, где возвращалось false. Это изменение связано с переходом к более строгой типизации.
<?
// PHP 8.1+
$result = pg_query($conn, 'SELECT * FROM users WHERE 1=0'); // Нет строк
$row = pg_fetch_row($result);
var_dump($row);
?>NULL
Рекомендуется проверять результат на null, а не на false в новых версиях.
Расширенные примеры
<?
$result = pg_query($conn, 'SELECT COUNT(*) FROM users');
$countArray = pg_fetch_row($result);
echo 'Количество пользователей: ' . $countArray[0];
// Альтернатива
pg_result_seek($result, 0); // Сброс указателя на первую строку
$count = pg_fetch_result($result, 0, 0); // Прямое получение значения
?>Количество пользователей: 42
<?
$result = pg_query($conn, 'SELECT id, large_text_field FROM huge_table');
$outputFile = fopen('output.csv', 'w');
while ($row = pg_fetch_row($result)) {
fputcsv($outputFile, $row); // Запись каждой строки в CSV
}
fclose($outputFile);
pg_free_result($result); // Явное освобождение памяти
?><?
$result = pg_query($conn, 'SELECT id, name, email FROM users WHERE id=1');
list($id, $name, $email) = pg_fetch_row($result);
echo "$id: $name <$email>";
?>1: Иван
<?
$result = pg_query($conn, 'SELECT id, name FROM users WHERE id=1');
$row = pg_fetch_row($result, null, PGSQL_BOTH); // Теперь доступны и числовые, и строковые ключи
echo $row[0] . ' ' . $row['id']; // Оба варианта работают
?>1 1
<?
$result = pg_query($conn, 'SELECT name FROM users ORDER BY id');
$totalRows = pg_num_rows($result);
for ($i = $totalRows - 1; $i >= 0; $i--) {
pg_result_seek($result, $i); // Перемещение указателя на строку $i
$row = pg_fetch_row($result);
echo $row[0] . "\n"; // Вывод в обратном порядке
}
?>