Start · Sprachen · PHP · Referenz · pg_unescape_bytea

pg_unescape_bytea

Funktion

Entfernt die PostgreSQL-Maskierung (Escaping) eines <code>bytea</code>-Wertes und gibt die ursprünglichen Binärdaten zurück.

seit PHP 4.3.0 Kategorie: db

Signatur

pg_unescape_bytea(string $string): string

Beschreibung

pg_unescape_bytea() ist das Gegenstück zu pg_escape_bytea(). Sie konvertiert einen PostgreSQL-bytea-String (der Oktal-Escape-Sequenzen wie \\001 oder Hex-Notation enthält) zurück in die ursprünglichen Rohdaten als PHP-String. Die Funktion wird typischerweise eingesetzt, wenn Binärdaten – etwa Bilder, PDF-Dateien oder beliebige Byte-Sequenzen – aus einer PostgreSQL-Datenbank gelesen werden.

Beim Speichern von Binärdaten in einer PostgreSQL-bytea-Spalte maskiert pg_escape_bytea() Sonderzeichen und Null-Bytes. Beim Lesen liefert die Datenbank diese maskierte Form zurück. pg_unescape_bytea() stellt daraus wieder den ursprünglichen Binär-String her, der anschließend z. B. direkt als HTTP-Response-Body ausgegeben oder in eine Datei geschrieben werden kann.

In modernen PostgreSQL-Treibern (libpq ab Version 9.0) wird standardmäßig das Hex-Format für bytea verwendet (\\x...). pg_unescape_bytea() versteht beide Formate (Oktal und Hex) und wählt automatisch die korrekte Dekodierungsstrategie.

Parameter

Name Typ Default Beschreibung
$string Pflicht string Der maskierte bytea-String, wie er von PostgreSQL zurückgeliefert wird (z. B. als Ergebnis eines SELECT-Abfrage auf eine bytea-Spalte).

Rückgabewert

Typ
string
Beschreibung
Gibt den entmaskierten Binär-String zurück. Der Rückgabewert kann beliebige Bytes inklusive Null-Bytes (\0) enthalten.

Beispiele

Binärdaten (Bild) aus PostgreSQL lesen und ausgeben

<?php
$conn = pg_connect('host=localhost dbname=mydb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

$result = pg_query($conn, "SELECT bild FROM produkte WHERE id = 42");
if (!$result) {
    die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}

$row = pg_fetch_assoc($result);
if ($row) {
    $binaerdaten = pg_unescape_bytea($row['bild']);

    header('Content-Type: image/jpeg');
    header('Content-Length: ' . strlen($binaerdaten));
    echo $binaerdaten;
}

pg_free_result($result);
pg_close($conn);

Roundtrip: Binärdaten speichern und wiederherstellen

<?php
$conn = pg_connect('host=localhost dbname=mydb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Originaldaten (z. B. Inhalt einer Datei)
$original = file_get_contents('/pfad/zur/datei.bin');

// Speichern (maskieren)
$escaped = pg_escape_bytea($conn, $original);
pg_query($conn, "INSERT INTO dateispeicher (daten) VALUES ('$escaped')");

// Lesen und wiederherstellen
$result = pg_query($conn, 'SELECT daten FROM dateispeicher ORDER BY id DESC LIMIT 1');
$row    = pg_fetch_row($result);
$wiederhergestellt = pg_unescape_bytea($row[0]);

if ($original === $wiederhergestellt) {
    echo 'Roundtrip erfolgreich: Daten sind identisch.' . PHP_EOL;
} else {
    echo 'Fehler: Daten weichen ab!' . PHP_EOL;
}

pg_close($conn);
Roundtrip erfolgreich: Daten sind identisch.

// Wichtig · Fallstricke

Encoding-Hinweis: pg_unescape_bytea() gibt einen rohen Binär-String zurück. Wird dieser String als Text weiterverarbeitet (z. B. in json_encode() eingebettet), können Null-Bytes und nicht-UTF-8-konforme Bytes zu Problemen führen. Für die Übertragung in JSON empfiehlt sich base64_encode() nach dem Entmaskieren.

libpq-Abhängigkeit: Die Funktion nutzt intern die libpq-Funktion PQunescapeBytea. Das Verhalten kann je nach libpq-Version leicht unterschiedlich sein, insbesondere beim Umgang mit dem Hex-Format (\\x...), das seit PostgreSQL 9.0 der Standard ist.

Keine SQL-Injection-Gefahr geht von dieser Funktion selbst aus, da sie nur lesend auf einen bereits empfangenen Datenbankwert wirkt. Stellen Sie jedoch sicher, dass die Abfrage, die den bytea-Wert liefert, selbst korrekt parametrisiert oder escaped ist.