Start · Sprachen · PHP · Referenz · pg_delete

pg_delete

Funktion

Löscht Datensätze aus einer PostgreSQL-Tabelle anhand eines assoziativen Arrays mit Bedingungen.

seit PHP 4.3.0 Kategorie: db

Signatur

pg_delete(PgSql\Connection $connection, string $table_name, array $conditions, int $flags = PGSQL_DML_EXEC): string|bool

Beschreibung

pg_delete() erzeugt und führt eine DELETE-Anweisung gegen eine PostgreSQL-Datenbank aus. Die zu löschenden Datensätze werden durch ein assoziatives Array ($conditions) bestimmt, dessen Schlüssel den Spaltennamen und dessen Werte den Vergleichswerten entsprechen. Alle Bedingungen werden intern mit AND verknüpft.

Die Funktion übernimmt automatisch das Escaping der übergebenen Werte, sofern das Flag PGSQL_DML_ESCAPE gesetzt ist, und schützt so vor SQL-Injection. Durch Übergabe von PGSQL_DML_STRING als $flags kann der erzeugte SQL-String zurückgegeben werden, ohne ihn auszuführen – praktisch zum Debuggen oder zum Weiterverwenden der Abfrage.

Die Funktion ist besonders nützlich, wenn Zeilen nach einfachen Gleichheitsbedingungen gelöscht werden sollen, ohne manuell eine DELETE-Anweisung formulieren zu müssen. Für komplexere Bedingungen (Bereiche, LIKE, Subabfragen) sollte hingegen pg_query_params() oder pg_prepare() verwendet werden.

  • PGSQL_DML_EXEC – führt die erzeugte Abfrage direkt aus (Standard).
  • PGSQL_DML_ASYNC – führt die Abfrage asynchron aus.
  • PGSQL_DML_STRING – gibt den SQL-String zurück, anstatt ihn auszuführen.
  • PGSQL_DML_ESCAPE – escaped Bezeichner und Werte zusätzlich.
  • PGSQL_DML_NO_CONV – deaktiviert automatische Typkonvertierungen.

Parameter

Name Typ Default Beschreibung
$connection Pflicht PgSql\Connection Eine aktive PostgreSQL-Verbindungsinstanz, wie sie von pg_connect() oder pg_pconnect() zurückgegeben wird.
$table_name Pflicht string Name der Tabelle, aus der Datensätze gelöscht werden sollen. Der Name muss ein gültiger PostgreSQL-Bezeichner sein.
$conditions Pflicht array Assoziatives Array mit Spaltenname-Wert-Paaren, die als WHERE-Bedingungen dienen. Alle Bedingungen werden mit AND verknüpft.
$flags int PGSQL_DML_EXEC Kombinierbare Flags, z. B. PGSQL_DML_STRING, PGSQL_DML_ESCAPE, PGSQL_DML_NO_CONV, PGSQL_DML_ASYNC. Steuern das Verhalten der Funktion.

Rückgabewert

Typ
string|bool
Beschreibung
Gibt true bei Erfolg zurück. Bei Angabe von PGSQL_DML_STRING wird der erzeugte SQL-String zurückgegeben. Im Fehlerfall wird false zurückgegeben.

Beispiele

Einfaches Löschen eines Datensatzes anhand der ID

<?php
$conn = pg_connect('host=localhost dbname=shop user=app password=geheim');

if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Löscht alle Datensätze in 'orders', bei denen order_id = 42 und status = 'cancelled'
$conditions = [
    'order_id' => 42,
    'status'   => 'cancelled',
];

$result = pg_delete($conn, 'orders', $conditions);

if ($result === true) {
    echo 'Datensatz erfolgreich gelöscht.';
} else {
    echo 'Fehler beim Löschen.';
}

pg_close($conn);
Datensatz erfolgreich gelöscht.

SQL-String vorab prüfen ohne Ausführung

<?php
$conn = pg_connect('host=localhost dbname=shop user=app password=geheim');

$conditions = [
    'user_id' => 7,
    'active'  => false,
];

// Nur den SQL-String erzeugen, nicht ausführen
$sql = pg_delete($conn, 'sessions', $conditions, PGSQL_DML_STRING | PGSQL_DML_ESCAPE);

echo $sql;
// Ausgabe: DELETE FROM "sessions" WHERE "user_id" = '7' AND "active" = 'f'

pg_close($conn);
DELETE FROM "sessions" WHERE "user_id" = '7' AND "active" = 'f'

// Wichtig · Fallstricke

Sicherheit: Obwohl pg_delete() intern Escaping unterstützt, sollte zusätzlich das Flag PGSQL_DML_ESCAPE gesetzt werden, um Bezeichner und Werte zuverlässig zu escapen und SQL-Injection zu verhindern. Tabellennamen sollten niemals direkt aus Benutzereingaben stammen.

Bedingungen: Alle angegebenen Bedingungen werden ausschließlich mit AND und dem =-Operator verknüpft. Komplexere Filterlogik (OR, BETWEEN, LIKE, IS NULL) erfordert pg_query_params() mit vorbereiteten Anweisungen.

Hinweis: Wird kein passender Datensatz gefunden, gibt die Funktion trotzdem true zurück – die Anzahl betroffener Zeilen lässt sich mit pg_affected_rows() ermitteln, wenn man die Abfrage manuell über pg_query() ausführt.