Signatur
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
\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);
// 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.