Pg last oid: примеры (PHP)

Использование pg_last_oid в PHP для получения OID
Раздел: Базы данных (PostgreSQL)
pg_last_oid(PgSql\Result $result): string|int|false

Описание функции pg_last_oid

Назначение функции

Функция pg_last_oid возвращает OID (Object Identifier) последней вставленной строки через подключение к PostgreSQL. OID - это уникальный идентификатор, который PostgreSQL автоматически присваивает каждой строке в таблицах, созданных с опцией OIDS.

Аргументы функции

Функция принимает один обязательный параметр:

  • connection - ресурс подключения к PostgreSQL, возвращаемый функциями pg_connect или pg_pconnect
Возвращаемое значение

Функция возвращает OID последней вставленной строки в виде строки или false в случае ошибки. С версии PHP 8.1 возвращает значение типа string|false.

Особенности использования

Функция работает только с таблицами, созданными с поддержкой OID. В современных версиях PostgreSQL OID по умолчанию отключен для пользовательских таблиц. Для использования функции необходимо явно указать WITH OIDS при создании таблицы или включить OID в настройках сервера.

Примеры использования pg_last_oid

Базовый пример вставки данных
<?php
$connection = pg_connect("host=localhost dbname=test user=postgres");

// Создаем таблицу с поддержкой OID
pg_query($connection, "CREATE TABLE users (id SERIAL, name TEXT) WITH OIDS");

// Вставляем данные
pg_query($connection, "INSERT INTO users (name) VALUES ('Иван Иванов')");

// Получаем OID последней вставленной строки
$oid = pg_last_oid($connection);
echo "OID последней вставленной строки: $oid";
pg_close($connection);
?>
OID последней вставленной строки: 123456
Пример с проверкой ошибок
<?php
$connection = pg_connect("host=localhost dbname=test");

if (!pg_query($connection, "INSERT INTO products (name) VALUES ('Товар')")) {
    echo "Ошибка при вставке данных";
} else {
    $oid = pg_last_oid($connection);
    if ($oid !== false) {
        echo "Успешная вставка с OID: $oid";
    } else {
        echo "Не удалось получить OID";
    }
}
?>

Альтернативные функции в PHP

RETURNING в запросе

Современный подход использует предложение RETURNING в SQL-запросе:

<?php
$result = pg_query($connection, 
    "INSERT INTO users (name) VALUES ('Алексей') RETURNING id, oid");
$row = pg_fetch_assoc($result);
echo "ID: {$row['id']}, OID: {$row['oid']}";
?>

Для получения конкретных значений из результата запроса:

<?php
$result = pg_query($connection, 
    "INSERT INTO users (name) VALUES ('Мария') RETURNING oid");
$oid = pg_fetch_result($result, 0, 'oid');
?>
Рекомендации по выбору

Использование RETURNING предпочтительнее, так как этот метод работает независимо от настроек OID таблицы и позволяет получать любые значения из вставленной строки. Функция pg_last_oid полезна для быстрого получения OID без изменения SQL-запросов.

Аналоги в других языках

Python (psycopg2)
import psycopg2

conn = psycopg2.connect("dbname=test")
cur = conn.cursor()
cur.execute("INSERT INTO users (name) VALUES (%s) RETURNING oid", ("Петр",))
oid = cur.fetchone()[0]
print(f"OID: {oid}")
JavaScript (Node.js с pg)
const { Client } = require('pg');
const client = new Client();

await client.connect();
const res = await client.query(
    "INSERT INTO users(name) VALUES($1) RETURNING oid", 
    ["Сергей"]
);
console.log(`OID: ${res.rows[0].oid}`);

Pg last oid в MySQL

В MySQL аналогом является LAST_INSERT_ID(), но он возвращает AUTO_INCREMENT значение, а не OID:

INSERT INTO users (name) VALUES ('Ольга');
SELECT LAST_INSERT_ID(); -- Возвращает ID последней вставки
Основные отличия

В отличие от PHP, большинство современных драйверов для PostgreSQL используют предложение RETURNING для получения идентификаторов. OID в PostgreSQL является устаревшей технологией, и многие приложения используют SERIAL или IDENTITY колонки вместо OID.

Типичные ошибки

Таблица без поддержки OID
<?php
// Таблица создана без WITH OIDS
pg_query($connection, "CREATE TABLE test (id SERIAL, data TEXT)");
pg_query($connection, "INSERT INTO test (data) VALUES ('тест')");
$oid = pg_last_oid($connection); // Вернет false
var_dump($oid);
?>
bool(false)
Отсутствие подключения к БД
<?php
$connection = false; // Некорректное подключение
$oid = pg_last_oid($connection); // Предупреждение и возврат false
?>
Использование после нескольких запросов
<?php
pg_query($connection, "INSERT INTO users (name) VALUES ('Анна')");
pg_query($connection, "SELECT * FROM users"); // Другой запрос
$oid = pg_last_oid($connection); // Может вернуть неожидаемый результат
?>
Рекомендации

Всегда проверяйте результат функции на false перед использованием. Убедитесь, что таблица создана с поддержкой OID. Используйте функцию сразу после выполнения INSERT-запроса.

Изменения в версиях PHP

PHP 8.1

Добавлена строгая типизация возвращаемого значения. Функция теперь явно возвращает string|false вместо смешанного типа.

PHP 8.0

Улучшены сообщения об ошибках при передаче некорректного соединения. Функция теперь более четко различает отсутствие OID и ошибку подключения.

Исторические изменения

В ранних версиях PHP функция могла возвращать число (integer) для небольших OID. Начиная с PHP 4.2, всегда возвращается строка (string) для поддержки больших значений OID.

Расширенные примеры

Пакетная вставка данных
Пример php
<?php
$connection = pg_connect("host=localhost dbname=company");
pg_query($connection, "CREATE TABLE employees (id SERIAL, name TEXT) WITH OIDS");

$names = ['Ирина', 'Дмитрий', 'Елена'];
$oids = [];

foreach ($names as $name) {
    pg_query($connection, "INSERT INTO employees (name) VALUES ('$name')");
    $oid = pg_last_oid($connection);
    if ($oid !== false) {
        $oids[] = $oid;
    }
}

echo "Вставлено записей: " . count($oids) . "\n";
echo "OID вставленных строк: " . implode(', ', $oids);
?>
Использование в транзакции
Пример php
<?php
pg_query($connection, "BEGIN");

try {
    pg_query($connection, "INSERT INTO orders (product) VALUES ('Ноутбук')");
    $orderOid = pg_last_oid($connection);
    
    pg_query($connection, "INSERT INTO order_details (order_oid, quantity) VALUES ('$orderOid', 1)");
    
    pg_query($connection, "COMMIT");
    echo "Заказ создан с OID: $orderOid";
} catch (Exception $e) {
    pg_query($connection, "ROLLBACK");
    echo "Ошибка: " . $e->getMessage();
}
?>
Получение OID для системных таблиц
Пример php
<?php
// Системные таблицы всегда имеют OID
pg_query($connection, "INSERT INTO pg_class (relname) VALUES ('test_class')");
$oid = pg_last_oid($connection);

if ($oid !== false) {
    // Использование OID для поиска в системном каталоге
    $result = pg_query($connection, 
        "SELECT * FROM pg_class WHERE oid = '$oid'");
    $data = pg_fetch_assoc($result);
    print_r($data);
}
?>
Интеграция с другими функциями
Пример php
<?php
// Создание таблицы и немедленная вставка
pg_query($connection, 
    "CREATE TEMP TABLE session_data (data JSONB) WITH OIDS");

$jsonData = json_encode(['user_id' => 42, 'last_login' => date('c')]);
pg_query($connection, 
    "INSERT INTO session_data (data) VALUES ('$jsonData')");

$oid = pg_last_oid($connection);
// Использование OID как ключа в кэше
$cache[$oid] = ['created' => time(), 'data' => $jsonData];

echo "Данные сессии сохранены под OID: $oid";
?>

PHP pg_last_oid function comments

En
Pg last oid Returns the last row's OID