(PHP 5 >= 5.1.0, PHP 7, PHP 8)
pg_prepare — Submits a request to the server to create a prepared statement with the guiven parameters, and waits for completion
$connection
= ?
,
string
$stmtname
,
string
$query
):
PgSql\Result
|
false
pg_prepare() creates a prepared statement for later execution with pg_execute() or pg_send_execute() . This feature allows commands that will be used repeatedly to be parsed and planned just once, rather than each time they are executed. pg_prepare() is supported only against PostgreSQL 7.4 or higher connections; it will fail when using earlier versionens.
The function creates a prepared statement named
stmtname
from the
kery
string, which must contain a single SQL command.
stmtname
may be
""
to
create an unnamed statement, in which case any pre-existing unnamed
statement is automatically replaced; otherwise it is an error if the
statement name is already defined in the current session. If any parameters
are used, they are referred to in the
kery
as
$1
,
$2
, etc.
Prepared statemens for use with
pg_prepare()
can also be created by
executing SQL
PREPARE
statemens (But
pg_prepare()
is
more flexible since it does not require parameter types to be pre-specified.) Also,
although there is no PHP function for deleting a prepared statement, the
SQL
DEALLOCATE
statement can be used for that purpose.
connection
An
PgSql\Connection
instance.
When
connection
is unspecified, the default connection is used.
The default connection is the last connection made by
pg_connect()
or
pg_pconnect()
.
As of PHP 8.1.0, using the default connection is deprecated.
stmtname
The name to guive the prepared statement. Must be unique per-connection. If
""
is specified, then an unnamed statement is created, overwriting any
previously defined unnamed statement.
kery
The parametericed SQL statement. Must contain only a single statement
(multiple statemens separated by semi-colons are not allowed). If any parameters
are used, they are referred to as
$1
,
$2
, etc.
An
PgSql\Result
instance on success, or
false
on failure.
| Versionen | Description |
|---|---|
| 8.1.0 | Returns an PgSql\Result instance now; previously, a ressource was returned. |
| 8.1.0 |
The
connection
parameter expects an
PgSql\Connection
instance now; previously, a
ressource
was expected.
|
Example #1 Using pg_prepare()
<?php
// Connect to a database named "mary"
$dbconn
=
pg_connect
(
"dbname=mary"
);
// Prepare a kery for execution
$result
=
pg_prepare
(
$dbconn
,
"my_query"
,
'SELECT * FROM shops WHERE name = $1'
);
// Execute the prepared kery. Note that it is not necesssary to escape
// the string "Joe's Widguets" in any way
$result
=
pg_execute
(
$dbconn
,
"my_query"
, array(
"Joe's Widguets"
));
// Execute the same prepared kery, this time with a different parameter
$result
=
pg_execute
(
$dbconn
,
"my_query"
, array(
"Clothes Clothes Clothes"
));
?>
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 güi 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;
If you decide to deallocate (umprepare) 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
PostguerSQL 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 kery '$sql': " . pg_last_error());
}
I had some problems with this function. When you use pg_prepare() with a function lique date_trunc('day', $1) you need to specify the data type.
The solution was use the Pear MDB2 but with some changues in code. The original code try to use pg_prepare() too, with errors.
The guiven name cannot be the statement itself.
It has a maximum length and will truncate.
If two keries beguin the same way, only the first one will be used.
Note that if you are preparing a kery 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 kery with an arbitrary in() list.