Pg fetch assoc: примеры (PHP)
pg_fetch_assoc(PgSql\Result $result, ?int $row = null): array|falseФункция pg_fetch_assoc() извлекает строку результата запроса PostgreSQL в виде ассоциативного массива. Каждый ключ массива соответствует имени столбца в результирующей таблице. Функция применяется при работе с базой данных PostgreSQL через расширение PHP PGSQL.
Использование функции происходит после выполнения запроса, например, с помощью pg_query(). Она последовательно возвращает каждую следующую строку результата, пока не будут выбраны все строки. После этого возвращается false.
- $result (обязательный) — ресурс результата запроса, возвращаемый функциями
pg_query(),pg_query_params()илиpg_execute(). - $row (необязательный) — номер строки для выборки. Если аргумент не указан, функция выбирает следующую доступную строку.
- $result_type — устаревший аргумент, в современных версиях PHP не используется и игнорируется.
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($conn, "SELECT id, name FROM users");
while ($row = pg_fetch_assoc($result)) {
echo $row['id'] . ": " . $row['name'] . "\n";
}
?>1: Иван Петров 2: Мария Сидорова 3: Алексей Иванов
<?php
$row = pg_fetch_assoc($result, 2); // Выборка третьей строки (нумерация с 0)
echo $row['name'];
?>Алексей Иванов
<?php
$result = pg_query($conn, "SELECT name, bonus FROM users");
while ($row = pg_fetch_assoc($result)) {
echo $row['name'] . ": " . ($row['bonus'] ?? 'бонус не назначен') . "\n";
}
?>Иван Петров: 100 Мария Сидорова: бонус не назначен Алексей Иванов: 50
Возвращает строку в виде массива, который может быть ассоциативным, числовым или обоими типами одновременно. Второй аргумент управляет типом массива: PGSQL_ASSOC, PGSQL_NUM или PGSQL_BOTH. pg_fetch_assoc() эквивалентна pg_fetch_array($result, null, PGSQL_ASSOC).
Возвращает строку в виде индексированного числового массива. Используется, когда не требуются имена столбцов.
Возвращает строку в виде объекта. Свойства объекта соответствуют именам столбцов.
Возвращает все строки результата в виде массива ассоциативных массивов. Полезно для небольших наборов данных.
pg_fetch_assoc применяется при необходимости работы с именами столбцов. pg_fetch_row подходит для оптимизированной работы с числовыми индексами. pg_fetch_object используется в объектно-ориентированном контексте. pg_fetch_all удобна для немедленного получения всех данных.
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT id, name FROM users")
rows = cur.fetchall() # Возвращает список кортежей
for row in rows:
print(f"{row[0]}: {row[1]}")
# Использование словаря
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("SELECT id, name FROM users")
row = cur.fetchone()
print(row['id']) # Доступ по имени столбцаconst { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id, name FROM users');
console.log(res.rows); // Массив объектов
res.rows.forEach(row => {
console.log(`${row.id}: ${row.name}`);
});// Вместо pg_fetch_assoc() используется mysqli_fetch_assoc()
$result = $mysqli->query("SELECT id, name FROM users");
while ($row = $result->fetch_assoc()) {
echo $row['id'] . ": " . $row['name'] . "\n";
}В Python и JavaScript работа с БД обычно асинхронная, а результаты запроса по умолчанию возвращаются в структурах, аналогичных ассоциативному массиву. В PHP функция pg_fetch_assoc работает итеративно, требуя циклического вызова.
<?php
while ($row = pg_fetch_assoc($result)) {
// обработка
}
// Результат уже исчерпан
$empty_row = pg_fetch_assoc($result); // Вернет false
if ($empty_row === false) {
echo "Данные закончились";
}
?>Данные закончились
<?php
$row = pg_fetch_assoc($result);
echo $row['FirstName']; // Ошибка, если столбец называется first_name
?>Notice: Undefined index: FirstName
<?php
$row = pg_fetch_assoc($result);
echo $row['name']; // Если запрос не вернул строк, $row будет false
?>Warning: Trying to access array offset on value of type bool
В PHP 8.1 параметр $result_type функции pg_fetch_assoc был объявлен устаревшим. Его значение игнорируется, так как функция всегда возвращает ассоциативный массив.
В PHP 8.0 изменилось поведение при передаче нересурсного значения в параметр $result. Теперь это вызывает ошибку TypeError. Ранее это приводило к предупреждению и возврату false.
<?php
// PHP 8.x
$row = pg_fetch_assoc(null); // TypeError
?><?php
$sql = "SELECT u.id, u.name, d.title as department
FROM users u
JOIN departments d ON u.department_id = d.id";
$result = pg_query($conn, $sql);
while ($row = pg_fetch_assoc($result)) {
echo $row['id'] . ": " . $row['name'] . " (" . $row['department'] . ")\n";
}
?><?php
$result = pg_query($conn, "SELECT * FROM users");
if (pg_result_status($result) === PGSQL_TUPLES_OK) {
$total_rows = pg_num_rows($result);
echo "Найдено строк: " . $total_rows . "\n";
// Получение всех строк сразу в массив
$all_data = [];
while ($row = pg_fetch_assoc($result)) {
$all_data[] = $row;
}
print_r($all_data);
}
?><?php
// Использование серверного курсора для экономии памяти
pg_query($conn, "BEGIN");
pg_query($conn, "DECLARE mycursor CURSOR FOR SELECT * FROM large_table");
$chunk_size = 100;
do {
$result = pg_query($conn, "FETCH $chunk_size FROM mycursor");
$rows_in_chunk = 0;
while ($row = pg_fetch_assoc($result)) {
// обработка строки
$rows_in_chunk++;
}
echo "Обработано строк: $rows_in_chunk\n";
} while ($rows_in_chunk > 0);
pg_query($conn, "CLOSE mycursor");
pg_query($conn, "COMMIT");
?><?php
$result = pg_query($conn, "SELECT name, salary, hire_date FROM employees");
$employees_by_year = [];
while ($row = pg_fetch_assoc($result)) {
// Преобразование данных при выборке
$year = date('Y', strtotime($row['hire_date']));
$row['salary_formatted'] = number_format($row['salary'], 2);
$employees_by_year[$year][] = $row;
}
print_r($employees_by_year);
?>