Pg insert: примеры (PHP)
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 'Запись успешно добавлена';
}Запись успешно добавлена
$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
Позволяет выполнить произвольный SQL-запрос INSERT. Используется при необходимости сложных запросов или множественных вставок. Требует ручного экранирования данных через pg_escape_string.
Предлагает подготовленные запросы с привязкой параметров, что повышает безопасность и производительность при многократных вставках. Поддерживает различные СУБД, не только PostgreSQL.
Функция pg_insert удобна для простых однократных вставок. Для операций с транзакциями или сложными условиями предпочтительнее pg_query. В современных приложениях чаще используют PDO для кроссплатформенной совместимости.
Аналоги в других языках программирования
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()const { Client } = require('pg');
const client = new Client();
await client.connect();
await client.query('INSERT INTO users(name, age) VALUES($1, $2)', ['Иван', 30]);$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
Функция pg insert теперь возвращает экземпляр PgSql\Result вместо ресурса (resource). Аргумент $connection теперь ожидает объект PgSql\Connection вместо ресурса соединения. Эти изменения связаны с переходом на объектно-ориентированную модель типов.
Добавлена поддержка флага PGSQL_DML_NO_CONV для отключения автоматического преобразования кодировки. Это полезно при работе с бинарными данными или специфическими кодировками.
Для обратной совместимости ресурсы по-прежнему автоматически преобразуются в объекты, но рекомендуется обновлять код для работы с объектами.
Расширенные примеры использования
$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);$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');
}$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);$connection = pg_connect('host=localhost dbname=test');
$data = [
'tags' => '{PHP,PostgreSQL,Базы данных}',
'numbers' => '{1,2,3}'
];
$result = pg_insert($connection, 'articles', $data);$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);$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);