Pg fetch all: примеры (PHP)
pg_fetch_all(PgSql\Result $result, int $mode = PGSQL_ASSOC): arrayФункция pg_fetch_all извлекает все строки из результата запроса PostgreSQL в виде массива. Эта функция применяется после выполнения запроса функциями pg_query или pg_send_query/pg_get_result для получения полного набора данных.
- result (обязательный): Ресурс результата запроса PostgreSQL, возвращаемый функциями
pg_query,pg_send_queryиpg_get_result. - mode (необязательный, доступен с PHP 8.1): Константа, определяющая тип возвращаемого массива:
PGSQL_ASSOC(по умолчанию) — возвращает ассоциативный массив.PGSQL_NUM— возвращает индексированный массив.PGSQL_BOTH— возвращает массив, индексированный как числами, так и именами столбцов.
Функция возвращает массив массивов или false, если строк нет или произошла ошибка.
<?
$pdo = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_query($pdo, "SELECT id, name FROM products");
$allRows = pg_fetch_all($result);
print_r($allRows);
?>Array
(
[0] => Array
(
[id] => 1
[name] => Клавиатура
)
[1] => Array
(
[id] => 2
[name] => Монитор
)
)<?
$result = pg_query($pdo, "SELECT id, name FROM products");
$allRows = pg_fetch_all($result, PGSQL_NUM);
print_r($allRows);
?>Array
(
[0] => Array
(
[0] => 1
[1] => Клавиатура
)
[1] => Array
(
[0] => 2
[1] => Монитор
)
)- pg_fetch_assoc: Извлекает одну строку как ассоциативный массив. Применяется для пошаговой обработки больших результатов или при необходимости получить только одну запись.
- pg_fetch_row: Извлекает одну строку как индексированный массив. Подходит, когда не требуются имена столбцов.
- pg_fetch_array: Извлекает строку как массив в одном из трех форматов (ASSOC, NUM, BOTH). Универсальная, но менее производительная, чем специализированные.
- pg_fetch_object: Извлекает строку как объект. Удобно для работы в объектном стиле.
Функцию pg_fetch_all предпочтительнее использовать, когда нужны все строки результата сразу, а объем данных не слишком велик. Для больших наборов данных лучше применять pg_fetch_assoc или pg_fetch_row в цикле, чтобы снизить потребление памяти.
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cur = conn.cursor()
cur.execute("SELECT id, name FROM products")
rows = cur.fetchall() # Возвращает список кортежей
print(rows)[(1, 'Клавиатура'), (2, 'Монитор')]В Python fetchall() возвращает список кортежей, а не список словарей. Для получения ассоциативного массива используется DictCursor.
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT id, name FROM products');
console.log(res.rows); // Массив объектов[ { id: 1, name: 'Клавиатура' }, { id: 2, name: 'Монитор' } ]В Node.js драйвер pg по умолчанию возвращает массив объектов, что аналогично pg_fetch_all с PGSQL_ASSOC.
$mysqli = new mysqli("localhost", "user", "pass", "test");
$result = $mysqli->query("SELECT id, name FROM products");
$allRows = $result->fetch_all(MYSQLI_ASSOC); // Появилась в PHP 5.3
print_r($allRows);Функция fetch_all() в MySQLi аналогична pg_fetch_all, но доступна только при использовании mysqlnd драйвера.
<?
$result = false;
$data = pg_fetch_all($result); // Предупреждение
?>Warning: pg_fetch_all() expects parameter 1 to be resource, bool givenФункция требует корректный ресурс результата. Всегда проверяйте успешность выполнения запроса.
<?
$result = pg_query($pdo, "SELECT id, name FROM products");
$data = pg_fetch_all($result, 999); // Несуществующая константа
?>При неверном значении режима используется значение по умолчанию PGSQL_ASSOC.
<?
$result = pg_query($pdo, "SELECT * FROM products WHERE 1=0");
$data = pg_fetch_all($result);
var_dump($data);
?>bool(false)При отсутствии строк функция возвращает false, а не пустой массив. Это нужно учитывать при дальнейшей обработке.
- PHP 8.1: Добавлен необязательный аргумент
$mode, позволяющий выбирать тип возвращаемого массива. До этой версии функция всегда возвращала ассоциативный массив. - PHP 8.0: Изменен тип возвращаемого значения. Теперь функция возвращает
array|false. Ранее возвращалсяarray, что могло вводить в заблуждение при пустом результате.
Не рекомендуется использовать pg_fetch_all для очень больших результатов. Лучше применять цикл.
<?
$result = pg_query($pdo, "SELECT * FROM huge_table");
while ($row = pg_fetch_assoc($result)) {
// Обработка каждой строки по отдельности
processRow($row);
}
?><?
$result = pg_query($pdo, "SELECT id, name, price FROM products");
$allProducts = pg_fetch_all($result);
// Преобразование в массив вида id => name
$idNameMap = array_column($allProducts, 'name', 'id');
print_r($idNameMap);
// Подсчет средней цены
$totalPrice = array_sum(array_column($allProducts, 'price'));
$avgPrice = $totalPrice / count($allProducts);
?><?
$result = pg_query($pdo, "SELECT id, name FROM products LIMIT 1");
$row = pg_fetch_all($result, PGSQL_BOTH);
print_r($row);
?>Array
(
[0] => Array
(
[id] => 1
[0] => 1
[name] => Клавиатура
[1] => Клавиатура
)
)Режим PGSQL_BOTH создает избыточные данные, поэтому используется редко.
<?
$result = pg_query($pdo, "SELECT id, attributes::json FROM products");
$all = pg_fetch_all($result);
// Предположим, что attributes содержит JSON
foreach ($all as $product) {
$attrs = json_decode($product['attributes'], true);
echo $product['id'] . ': ' . $attrs['color'] . "\n";
}
?>