PHP 8.5.0 Alpha 2 available for testing

pg_prepare

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

pg_prepare Envía una solicitud al servidor para crear una sentencia preparada con los parámetros dados y espera la ejecución

Descripción

pg_prepare(PgSql\Connection $connection = ?, string $stmtname, string $query): PgSql\Result|false

pg_prepare() crea una consulta preparada para una ejecución posterior con pg_execute() o pg_send_execute(). Esta característica permite que las órdenes que serán utilizadas repetidamente sean analizadas y planificadas una sola vez, en lugar de ser ejecutadas cada vez. pg_prepare() es soportada solo con las versiones PostgreSQL 7.4 o más recientes; la orden fallará si se utiliza con versiones anteriores.

La función crea una consulta preparada llamada stmtname a partir de la cadena query, la cual debe contener una sola orden SQL. stmtname puede ser "" para crear una consulta sin nombre. En este caso, las consultas que existían y que no tenían nombres son automáticamente sobrescritas; de lo contrario, habrá un error si el nombre de la consulta ya está definido en la sesión actual. Si se utilizan parámetros, estos son referenciados como $1, $2, etc. en query.

Las consultas preparadas para ser utilizadas con pg_prepare() también pueden ser creadas ejecutando la orden SQL PREPARE. (Sin embargo, pg_prepare() es más flexible ya que no requiere que los tipos de los parámetros sean preespecificados.) Además, aunque no existe una función PHP para eliminar una consulta preparada, la orden SQL DEALLOCATE puede ser utilizada para este propósito.

Parámetros

connection

Una instancia PgSql\Connection. Cuando connection no es especificado, se usa la conexión por defecto. La conexión por defecto es la última conexión hecha por pg_connect() o pg_pconnect()

Advertencia

Desde PHP 8.1.0, usar la conexión por defecto está obsoleto.

stmtname

El nombre a dar a la consulta preparada. Debe ser único para cada sesión. Si se especifica una cadena vacía "" entonces se crea una consulta sin nombre, sobrescribiendo las consultas sin nombres previamente definidas.

query

La consulta SQL con sus parámetros. Debe contener solo una sola consulta. Varios comandos separados por punto y coma no son permitidos. Si se utilizan parámetros, estos son referenciados como $1, $2, etc.

Valores devueltos

Una instancia PgSql\Result en caso de éxito, o false si ocurre un error.

Historial de cambios

Versión Descripción
8.1.0 Ahora devuelve una instancia de PgSql\Result ; anteriormente, se devolvía un resource.
8.1.0 El parámetro connection ahora espera una instancia de PgSql\Connection ; anteriormente, se esperaba un resource.

Ejemplos

Ejemplo #1 Ejemplo con pg_prepare()

<?php
// Conexión a una base de datos llamada "marie"
$dbconn = pg_connect("dbname=marie");

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

// Ejecuta la consulta preparada. Note que no es necesario escapar
// la cadena "Joe's Widgets"
$result = pg_execute($dbconn, "my_query", array("Joe's Widgets"));

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

?>

Ver también

  • pg_execute() - Ejecuta una consulta preparada de PostgreSQL
  • pg_send_execute() - Envía una consulta para ejecutar una consulta preparada con parámetros dados, sin esperar el(los) resultado(s)

add a note

User Contributed Notes 6 notes

up
4
david at fetter dot org
20 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
3
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
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
1
geompse at gmail dot com
13 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
19 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
-4
andy at petdance dot com
17 years ago
Any error in the prepare is available from pg_last_error().
To Top