ConFoo 2025

pg_prepare

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

pg_prepare Envía una solicitud para crear una sentencia preparada con los parámetros dados, y espera que se complete

Descripción

pg_prepare(resource $connection = ?, string $stmtname, string $query): resource

pg_prepare() crea una sentencia preparada para la ejecución posterior con pg_execute() o pg_send_execute(). Esta característica permite que los comandos que se utilizarán repetidamente se analicen y se planifiquen sólo una vez, en lugar de cada vez que se ejecuten. pg_prepare() Está soportado sólo para conexiones de PostgreSQL 7.4 o superior; fallará al usar versiones anteriores.

La función crea una sentencia preparada denominada stmtname desde la cadena query, que debe contener un único comando SQL. stmtname puede ser "" para crear una sentencia sin nombre, en cuyo caso se sustituye automáticamente cualquier sentencia sin nombre preexistente; de lo contrario, es un error si el nombre de la sentencia ya está definido en la sesión actual. Si se utilizan parámetros, se refieren al query como $1, $2, etc.

Las sentencias preparadas para su uso con pg_prepare() también se pueden crear ejecutando sentencias SQL PREPARE. (Pero pg_prepare() es más flexible, ya que no requiere preespecificar los tipos de parámetros.) Además, aunque no existe ninguna función PHP para borrar una sentencia preparada, la sentencia SQL DEALLOCATE puede utilizarse para ese propósito.

Parámetros

connection

Recurso de conexión a una base de datos de PostgreSQL. Cuando connection no está presente, se utilizará la conexión predeterminada. Esta es la última conexión realizada por pg_connect() o pg_pconnect().

stmtname

El nombre para dar la declaración preparada. Debe ser una conexión única. Si se especifica como "", entonces se crea una declaración sin nombre, sobrescribiendo cualquier declaración sin nombre previamente definida.

query

La declaración SQL parametrizada. Debe contener una sola declaración. (No se permiten las declaraciones múltiples separadas por punto y coma). Si se utiliza algún parámetro, se denominan $1, $2, etc.

Valores devueltos

Un recurso de consulta en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 Usando pg_prepare()

<?php
// Conéctese a una base de datos llamada "mary"
$dbconn = pg_connect("dbname=mary");

// Preparar una consulta para la ejecución
$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name = $1');

// Ejecute la consulta preparada. Tenga en cuenta que no es necesario escapar
// el string "Joe's Widgets" de cualquier manera
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

// Ejecutar la misma consulta preparada, esta vez con un parámetro diferente
$result = pg_execute($dbconn, "my_query", array("Clothes Clothes Clothes"));

?>

Ver también

  • pg_execute() - Envía una solicitud para ejecutar una setencia preparada con parámetros dados, y espera el resultado
  • pg_send_execute() - Sends a request to execute a prepared statement with given parameters, without waiting for the result(s)

add a note

User Contributed Notes 6 notes

up
5
david at fetter dot org
19 years ago
SQL is often a complicated piece of code by itself, so you may wish put it inside a "here doc." This will help you read it wherever it appears and test it by itself via a command-line or gui client.

$sql = <<<SQL
SELECT a.foo, b.bar, c.baz
FROM
table_a a
LEFT JOIN
table_b b
ON (
a.a_id = b.a_id
)
JOIN
table_c c
ON (
b.c_id = c.c_id
)
WHERE c.name = $1
SQL;
up
1
mike at musskopf dot com
17 years ago
I had some problems with this function. When you use pg_prepare() with a function like date_trunc('day', $1) you need to specify the data type.

The solution was use the Pear MDB2 but with some changes in code. The original code try to use pg_prepare() too, with errors.
up
2
rodrigo at fabricadeideias dot com
18 years ago
If you decide to deallocate (unprepare) a previously prepared sql command it might be better to quote the sql name as in

DEALLOCATE "theNameOfMySQL"

instead of (the more natural)

DEALLOCATE theNameOfMySQL

PostgerSQL preserves the case of your identifiers if, and only if, you quote them. The pg_prepare function preserves the case of the sql name you use.

A complete example would be

$sql = 'SELECT * FROM user WHERE cod_user = $1';
$sqlName = 'selectUserByCode';
if (!pg_prepare ($sqlName, $sql)) {
die("Can't prepare '$sql': " . pg_last_error());
}
$rs = pg_execute($sqlName, array(1));
do whatever you want with $rs and finally
$sql = sprintf(
'DEALLOCATE "%s"',
pg_escape_string($sqlName)
);
if(!pg_query($sql)) {
die("Can't query '$sql': " . pg_last_error());
}
up
1
geompse at gmail dot com
12 years ago
The given name cannot be the statement itself.
It has a maximum length and will truncate.

If two queries begin the same way, only the first one will be used.
up
0
scott dot marlowe at gmail dot com
18 years ago
Note that if you are preparing a query with an in clause with a list of items, you will need to prepare each item separately.

$result = pg_prepare($dbconn, "my_query", 'SELECT * FROM shops WHERE name IN($1,$2,$3)');

$result = pg_execute($dbconn, "my_query", array("coffee", "beer", "hard"));

This means that you can't just prepare a query with an arbitrary in() list.
up
-3
andy at petdance dot com
16 years ago
Any error in the prepare is available from pg_last_error().
To Top