Start · Sprachen · PHP · Referenz · pg_execute

pg_execute

Funktion

Führt eine zuvor mit <code>pg_prepare()</code> vorbereitete PostgreSQL-Anfrage mit den angegebenen Parametern aus und gibt das Ergebnis zurück.

seit PHP 5.0.0 Kategorie: db

Signatur

pg_execute(PgSql\Connection $connection = ?, string $stmtname, array $params): PgSql\Result|false

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

Typ
PgSql\Result|false
Beschreibung
Bei Erfolg ein 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);
Produkt: Beispielartikel – Preis: 19.99 €

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);
Bestellung erfolgreich eingefügt. Bestellung erfolgreich eingefügt. Bestellung erfolgreich eingefügt.

// 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.