Pg exec: примеры (PHP)
pg_exec(PgSql\Connection $connection, string $query): PgSql\Result|falseФункция pg_exec() выполняет SQL-запрос к базе данных PostgreSQL. Этот устаревший алиас для функции pg_query() применялся для отправки команд на сервер баз данных.
Функция принимает два аргумента:
- connection (ресурс) - обязательный. Идентификатор подключения к PostgreSQL, возвращаемый функциями
pg_connect()илиpg_pconnect(). - query (строка) - обязательный. SQL-запрос или команда для выполнения на сервере. Может содержать несколько выражений, разделенных точкой с запятой.
Функция возвращает ресурс результата запроса при успешном выполнении или false в случае ошибки.
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_exec($conn, "SELECT id, name FROM users WHERE active = true");
if ($result) {
echo "Запрос выполнен успешно";
}
Ресурс результата #N
$result = pg_exec($conn, "INSERT INTO products (title, price) VALUES ('Телефон', 25000)");
if ($result) {
$affected_rows = pg_affected_rows($result);
echo "Добавлено строк: $affected_rows";
}
Добавлено строк: 1
$result = pg_exec($conn, "SELEC * FROM users");
if (!$result) {
echo "Ошибка в запросе: " . pg_last_error($conn);
}
Ошибка в запросе: ERROR: syntax error at or near "SELEC"
В современных версиях PHP рекомендуется использовать прямую замену:
- pg_query() - функционально идентична
pg_exec(). Является предпочтительным вариантом, так какpg_exec()считается устаревшим алиасом. - pg_query_params() - выполняет параметризованный запрос, что защищает от SQL-инъекций. Применяется при необходимости подстановки переменных в запрос.
- pg_prepare() и pg_execute() - механизм подготовленных выражений. Полезен для многократного выполнения однотипных запросов.
Для операций, возвращающих единственное значение, удобнее использовать pg_query() в сочетании с pg_fetch_result().
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
results = cursor.fetchall()
const { Client } = require('pg');
const client = new Client();
await client.connect();
const res = await client.query('SELECT * FROM users');
console.log(res.rows);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query("SELECT * FROM users");
Ключевое отличие — в более современном подходе к работе с БД: часто используются параметризованные запросы или ORM, а не прямое выполнение строк SQL.
$conn = false;
$result = pg_exec($conn, "SELECT 1"); // Предупреждение и возврат false
Warning: pg_exec() expects parameter 1 to be resource, boolean given
$result = pg_exec($conn, "UPDATE table SET col = 1 WHERE id = 999");
$rows = pg_affected_rows($result); // Может выдать предупреждение, если $result === false
$name = $_POST['name'];
$result = pg_exec($conn, "SELECT * FROM users WHERE name = '$name'"); // Опасный код
Для безопасности следует использовать pg_query_params().
Функция pg_exec() изначально являлась основным способом выполнения запросов. В PHP 4.2.0 появился её алиас pg_query().
В документации PHP 7.x и 8.x pg_exec() указана как устаревший алиас для pg_query(). Её использование не вызывает ошибок или предупреждений, но для обеспечения ясности кода и будущей совместимости рекомендуется применять pg_query().
Семантика и поведение функции не менялись с момента её введения.
$sql = "
CREATE TEMP TABLE log (msg text);
INSERT INTO log VALUES ('Старт');
SELECT * FROM log;
";
$result = pg_exec($conn, $sql);
if ($result) {
do {
$rows = pg_fetch_all($result);
print_r($rows);
} while (pg_next_result($result));
}
// Использование DECLARE CURSOR
pg_exec($conn, "DECLARE mycursor CURSOR FOR SELECT * FROM large_table");
$result = pg_exec($conn, "FETCH 100 FROM mycursor");
while ($row = pg_fetch_assoc($result)) {
// Обработка порции данных
}
pg_exec($conn, "CLOSE mycursor");
$link = pg_connect("...");
pg_exec($link, "BEGIN");
$res1 = pg_exec($link, "INSERT INTO a VALUES (1)");
$res2 = pg_exec($link, "INSERT INTO b VALUES (2)");
if ($res1 && $res2) {
pg_exec($link, "COMMIT");
} else {
pg_exec($link, "ROLLBACK");
}
В современных приложениях подобную логику реализуют через PDO или используют pg_query().