Pg last oid: примеры (PHP)
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 в 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-запросов.
Аналоги в других языках
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}")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.
Типичные ошибки
<?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
Добавлена строгая типизация возвращаемого значения. Функция теперь явно возвращает string|false вместо смешанного типа.
Улучшены сообщения об ошибках при передаче некорректного соединения. Функция теперь более четко различает отсутствие OID и ошибку подключения.
В ранних версиях PHP функция могла возвращать число (integer) для небольших OID. Начиная с PHP 4.2, всегда возвращается строка (string) для поддержки больших значений OID.
Расширенные примеры
<?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
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();
}
?><?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
// Создание таблицы и немедленная вставка
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";
?>