Signatur
Beschreibung
pg_execute() sendet eine Anforderung an den PostgreSQL-Server, eine vorbereitete Anweisung (Prepared Statement) mit den übergebenen Parametern auszuführen. Die Funktion wartet, bis das Ergebnis vorliegt, und gibt ein Ergebnis-Objekt zurück. Vorbereitete Anweisungen müssen zuvor mit pg_prepare() registriert worden sein.
Der Hauptvorteil von Prepared Statements liegt in der Sicherheit und Effizienz: Parameter werden vom SQL-Text getrennt übertragen, wodurch SQL-Injection-Angriffe strukturell ausgeschlossen werden. Wird dieselbe Anweisung mehrfach mit unterschiedlichen Parametern ausgeführt, spart das Prepared Statement außerdem das wiederholte Parsen und Planen der Anfrage auf Serverseite.
Die Parameter in $params werden als einfache Werte übergeben – ohne manuelle Anführungszeichen oder Escaping. PostgreSQL kümmert sich selbst um die korrekte Typisierung anhand des Anweisungsschemas. Null-Werte können als PHP-null übergeben werden.
Der optionale Parameter $connection referenziert eine bestehende Datenbankverbindung. Wird er weggelassen, verwendet PHP die zuletzt geöffnete PostgreSQL-Verbindung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $connection | PgSql\Connection | Eine PostgreSQL-Datenbankverbindung, wie sie von pg_connect() oder pg_pconnect() zurückgegeben wird. Wird dieser Parameter weggelassen, wird die zuletzt geöffnete Verbindung verwendet. |
|
| $stmtname Pflicht | string | Der Name der vorbereiteten Anweisung, die ausgeführt werden soll. Dieser Name wurde zuvor beim Aufruf von pg_prepare() festgelegt. Ein leerer String ("") verweist auf die zuletzt erstellte unbenannte Anweisung. |
|
| $params Pflicht | array | Ein Array mit den Parameterwerten, die die Platzhalter ($1, $2, …) in der vorbereiteten Anweisung ersetzen. Werte werden ohne manuelles Escaping übergeben. null-Einträge werden als SQL-NULL interpretiert. |
Rückgabewert
PgSql\Result-Objekt (vor PHP 8.1 eine Ressource), das mit Funktionen wie pg_fetch_assoc() oder pg_num_rows() ausgewertet werden kann. Im Fehlerfall wird false zurückgegeben.Beispiele
Einfaches Prepared Statement mit pg_execute
<?php
$conn = pg_connect("host=localhost dbname=shop user=app password=geheim");
if (!$conn) {
die('Verbindung fehlgeschlagen');
}
// Anweisung vorbereiten
$prepared = pg_prepare($conn, 'get_product', 'SELECT id, name, price FROM products WHERE id = $1');
if ($prepared === false) {
die('Vorbereitung fehlgeschlagen: ' . pg_last_error($conn));
}
// Anweisung mit Parameter ausführen
$result = pg_execute($conn, 'get_product', [42]);
if ($result === false) {
die('Ausführung fehlgeschlagen: ' . pg_last_error($conn));
}
$row = pg_fetch_assoc($result);
if ($row) {
echo 'Produkt: ' . $row['name'] . ' – Preis: ' . $row['price'] . ' €';
} else {
echo 'Kein Produkt gefunden.';
}
pg_free_result($result);
pg_close($conn);
Mehrfache Ausführung derselben Anweisung mit unterschiedlichen Parametern
<?php
$conn = pg_connect("host=localhost dbname=shop user=app password=geheim");
// INSERT-Anweisung einmalig vorbereiten
pg_prepare($conn, 'insert_order', 'INSERT INTO orders (customer_id, product_id, quantity) VALUES ($1, $2, $3)');
$bestellungen = [
[101, 5, 2],
[102, 8, 1],
[103, 3, 4],
];
foreach ($bestellungen as $bestellung) {
$result = pg_execute($conn, 'insert_order', $bestellung);
if ($result === false) {
echo 'Fehler bei Bestellung: ' . pg_last_error($conn) . PHP_EOL;
} else {
echo 'Bestellung erfolgreich eingefügt.' . PHP_EOL;
pg_free_result($result);
}
}
pg_close($conn);
// Wichtig · Fallstricke
Sicherheit: Da Parameter separat vom SQL-Text übertragen werden, ist SQL-Injection durch pg_execute() strukturell ausgeschlossen – vorausgesetzt, die SQL-Struktur selbst (Tabellen- und Spaltennamen) stammt nicht aus Benutzereingaben. Niemals dynamische Bezeichner unkontrolliert in die SQL-Zeichenkette einbauen.
Datentypen: Alle Parameterwerte werden als Zeichenketten an PostgreSQL gesendet. Der Server nimmt die Typkonvertierung anhand der Anweisungsmetadaten vor. Für binäre Daten (Bytea) müssen die Werte zuvor mit pg_escape_bytea() kodiert werden.
Fehlerbehandlung: Im Fehlerfall liefert die Funktion false. Mit pg_last_error() lässt sich die genaue Fehlermeldung des Servers abfragen.
Hinweis zu PHP-Versionen: Ab PHP 8.1 gibt pg_execute() ein PgSql\Result-Objekt statt einer Ressource zurück. Der Funktionsaufruf selbst bleibt kompatibel.