Pg insert: примеры (PHP)

Руководство по работе с pg_insert для взаимодействия с PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_insert(PgSql\Connection $connection, string $table_name, array $values, int $flags = PGSQL_DML_EXEC): PgSql\Result|string|bool

Функция pg_insert в PHP

Назначение и применение

Функция pg_insert используется для вставки новой строки в таблицу базы данных PostgreSQL. Она автоматически формирует SQL-запрос INSERT на основе переданных ассоциативного массива данных. Функция часто применяется при работе с формами веб-приложений, импорте данных или автоматической записи логов.

Аргументы функции
  • $connection (обязательный) - ресурс соединения с базой данных PostgreSQL, возвращаемый функцией pg_connect или pg_pconnect.
  • $table_name (обязательный) - строка, содержащая имя таблицы для вставки данных.
  • $values (обязательный) - ассоциативный массив, где ключи соответствуют именам столбцов, а значения - данным для вставки.
  • $flags (опциональный) - комбинация констант, управляющих поведением функции: PGSQL_DML_EXEC (выполнить запрос, значение по умолчанию), PGSQL_DML_ESCAPE (экранировать специальные символы), PGSQL_DML_NO_CONV (отключить преобразование кодировки), PGSQL_DML_STRING (вернуть строку запроса вместо выполнения).
Возвращаемое значение

При успешном выполнении с флагом PGSQL_DML_EXEC возвращает ресурс результата. С флагом PGSQL_DML_STRING возвращает строку SQL-запроса. В случае ошибки возвращает false.

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

Базовый пример вставки данных
$connection = pg_connect('host=localhost dbname=test user=postgres');
$data = ['name' => 'Иван', 'age' => 30, 'city' => 'Москва'];
$result = pg_insert($connection, 'users', $data);
if ($result) {
    echo 'Запись успешно добавлена';
}
Запись успешно добавлена
Использование флага PGSQL_DML_STRING
$connection = pg_connect('host=localhost dbname=test user=postgres');
$data = ['product' => 'Книга', 'price' => 500];
$query = pg_insert($connection, 'products', $data, PGSQL_DML_STRING);
echo $query;
INSERT INTO products (product,price) VALUES ('Книга',500)
Вставка с экранированием специальных символов
$connection = pg_connect('host=localhost dbname=test user=postgres');
$data = ['title' => "O'Reilly & Sons", 'description' => 'Спецсимволы: > < &'];
$result = pg_insert($connection, 'books', $data, PGSQL_DML_ESCAPE);
Данные корректно экранированы и вставлены

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

Функция pg_query с ручным формированием запроса

Позволяет выполнить произвольный SQL-запрос INSERT. Используется при необходимости сложных запросов или множественных вставок. Требует ручного экранирования данных через pg_escape_string.

Расширение PDO с методом prepare

Предлагает подготовленные запросы с привязкой параметров, что повышает безопасность и производительность при многократных вставках. Поддерживает различные СУБД, не только PostgreSQL.

Рекомендации по выбору

Функция pg_insert удобна для простых однократных вставок. Для операций с транзакциями или сложными условиями предпочтительнее pg_query. В современных приложениях чаще используют PDO для кроссплатформенной совместимости.

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

Python с библиотекой psycopg2
import psycopg2
conn = psycopg2.connect('host=localhost dbname=test')
cursor = conn.cursor()
cursor.execute('INSERT INTO users (name, age) VALUES (%s, %s)', ('Иван', 30))
conn.commit()
JavaScript с библиотекой node-postgres
const { Client } = require('pg');
const client = new Client();
await client.connect();
await client.query('INSERT INTO users(name, age) VALUES($1, $2)', ['Иван', 30]);
MySQL в PHP
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$stmt = $mysqli->prepare('INSERT INTO users (name, age) VALUES (?, ?)');
$stmt->bind_param('si', 'Иван', 30);
$stmt->execute();
Особенности

В отличие от pg_insert, большинство альтернатив требуют явного написания SQL-запроса. Python и JavaScript обычно используют параметризованные запросы для безопасности. Подход PDO в PHP наиболее схож с методами других языков.

Типичные ошибки при использовании

Неверный формат массива данных
$connection = pg_connect('host=localhost dbname=test');
$data = 'Иван, 30';  // Строка вместо массива
$result = pg_insert($connection, 'users', $data);
Warning: pg_insert(): Expected array for values, string given
Отсутствующее соединение с базой
$connection = false;  // Неудачное соединение
$data = ['name' => 'Иван'];
$result = pg_insert($connection, 'users', $data);
Warning: pg_insert(): supplied resource is not a valid PostgreSQL link resource
Попытка вставки в несуществующий столбец
$connection = pg_connect('host=localhost dbname=test');
$data = ['undefined_column' => 'значение'];
$result = pg_insert($connection, 'users', $data);
Warning: pg_insert(): Unknown column 'undefined_column' in table 'users'
Несоответствие типов данных
$connection = pg_connect('host=localhost dbname=test');
// Предположим, что столбец age имеет тип integer
$data = ['age' => 'не число'];  
$result = pg_insert($connection, 'users', $data);
ERROR: invalid input syntax for type integer: "не число"

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

PHP 8.0

Функция pg insert теперь возвращает экземпляр PgSql\Result вместо ресурса (resource). Аргумент $connection теперь ожидает объект PgSql\Connection вместо ресурса соединения. Эти изменения связаны с переходом на объектно-ориентированную модель типов.

PHP 8.1

Добавлена поддержка флага PGSQL_DML_NO_CONV для отключения автоматического преобразования кодировки. Это полезно при работе с бинарными данными или специфическими кодировками.

Совместимость

Для обратной совместимости ресурсы по-прежнему автоматически преобразуются в объекты, но рекомендуется обновлять код для работы с объектами.

Расширенные примеры использования

Вставка JSON данных
Пример php
$connection = pg_connect('host=localhost dbname=test');
$json_data = json_encode(['color' => 'red', 'size' => 'L']);
$data = ['id' => 1, 'attributes' => $json_data];
$result = pg_insert($connection, 'products', $data, PGSQL_DML_ESCAPE);
Массовая вставка через цикл с транзакцией
Пример php
$connection = pg_connect('host=localhost dbname=test');
pg_query($connection, 'BEGIN');
try {
    $users = [
        ['name' => 'Анна', 'age' => 25],
        ['name' => 'Петр', 'age' => 35]
    ];
    foreach ($users as $user) {
        pg_insert($connection, 'users', $user);
    }
    pg_query($connection, 'COMMIT');
} catch (Exception $e) {
    pg_query($connection, 'ROLLBACK');
}
Вставка с возвратом идентификатора
Пример php
$connection = pg_connect('host=localhost dbname=test');
$data = ['title' => 'Новая запись'];
pg_insert($connection, 'posts', $data);
$id = pg_last_oid($connection);  // Получение OID
$result = pg_query($connection, 'SELECT * FROM posts WHERE oid = ' . $id);
Использование с массивами PostgreSQL
Пример php
$connection = pg_connect('host=localhost dbname=test');
$data = [
    'tags' => '{PHP,PostgreSQL,Базы данных}',
    'numbers' => '{1,2,3}'
];
$result = pg_insert($connection, 'articles', $data);
Комбинация флагов
Пример php
$connection = pg_connect('host=localhost dbname=test');
$data = ['comment' => 'Текст с > символами'];
$result = pg_insert($connection, 'comments', $data, 
    PGSQL_DML_EXEC | PGSQL_DML_ESCAPE | PGSQL_DML_NO_CONV);
Вставка бинарных данных
Пример php
$connection = pg_connect('host=localhost dbname=test');
$binary_data = file_get_contents('image.jpg');
$escaped_data = pg_escape_bytea($connection, $binary_data);
$data = ['image_data' => $escaped_data];
$result = pg_insert($connection, 'images', $data);

PHP pg_insert function comments

En
Pg insert Insert array into table