Bytea in PostgreSQL con PHP e PDO

Nell’articolo precedente abbiamo visto le basi per la connessione a database PostgreSQL in PHP utilizzando PDO. In questo breve documento vedremo come effettuare inserimenti e come recuperare dati memorizzati in formato bytea in un database PostgreSQL utilizzando PHP con PDO. Il tipo di dato bytea è un’alternativa fornita da PostgreSQL per la memorizzazione di oggetti binari (nei comuni DBMS e in SQL questi sono conosciuti come binary large objects o semplicemente BLOB). La gestione dei bytea è molto più semplice della gestione dei BLOB tradizionali, e questo è uno dei motivi del successo di questo tipo di dato in Postgres.

Come definito nella documentazione di PostgreSQL sui tipi di dato binario, il tipo di dato bytea permette la memorizzazione di stringhe binarie (vere e proprie sequenze di byte) di lunghezza variabile in un campo di una tabella. PostgreSQL fornisce le specifiche per la codifica di queste stringhe binarie, tuttavia i linguaggi di programmazione e le librerie di astrazione più comuni mettono a disposizione meccanismi automatici e trasparenti per la serializzazione/deserializzazione dei dati. PDO per PHP è uno di questi. Purtroppo, la documentazione sul tipo di dato bytea di PostgreSQL è molto scarsa e uno degli obiettivi di questo articolo è di dimostrare con un esempio quanto questo sia facile. Gli esempi forniti sono molto semplici e il loro scopo è puramente didattico. Non sono da utilizzare "così come sono" in un ambiente di produzione in quanto non sono gestiti gli errori e le eccezioni.

La tabella ‘documenti’

Supponiamo di avere una tabella chiamata documenti, così composta:


CREATE TABLE documenti (
id serial,
documento bytea
);

E supponiamo di volere memorizzare il contenuto compresso di una stringa di testo dentro il campo documento. In PHP è possibile comprimere il contenuto di una stringa con il comando gzencode. La funzione ritorna una stringa binaria che può essere memorizzata come oggetto binario in PostgreSQL.


// $docstr contiene la stringa originale (ad esempio un documento HTML)
// $gzdoc contiene la stringa binaria (il documento HTML compresso ad esempio)
$gzdoc = gzencode($docstr);

Inserimento di un campo bytea

Il primo passo consiste nella creazione della query preparata:


$stmt = $connection->prepare('INSERT INTO documenti (documento) VALUES (?)');

Il passo successivo è quello di informare PDO che il primo parametro della query preparata è un tipo di dato bytea e deve essere trattato come un dato binario. La costante PDO da utilizzare è PDO::PARAM_LOB.


$stmt->bindParam(1, $gzdoc, PDO::PARAM_LOB);

L’ultimo passo è l’esecuzione della query:


$stmt->execute();

Selezione di un campo bytea

Il modo migliore per recuperare il contenuto di un campo bytea è quello di associare una colonna a una variabile utilizzando bindColumn della classe PDOStatement. Il codice di esempio è fornito qui sotto:


// la variabile $id contiene l'ID del documento da recuperare
$stmt = $dbh->prepare('SELECT documento FROM documenti WHERE id = ?');
$stmt->bindParam(1, $id, PDO::PARAM_INT);
$stmt->execute(); // esegue la query
// Associa la prima colonna di risultato alla variabile locale
// $gzdoc che conterrà il valore del campo 'documento'
$stmt->bindColumn(1, $gzdoc);
$stmt->fetch(PDO::FETCH_BOUND);
// echo $gzdoc; // visualizza la stringa binaria
// echo gzdecode($gzdoc); // visualizza la stringa originale

Conclusioni

Questa breve guida ha esposto un piccolo esempio di inserimento e di selezione di dati binari in PostgreSQL memorizzati in campi bytea utilizzando PHP e PDO. Il tipo di dato bytea rappresenta una delle caratteristiche peculiari di Postgres nel trattamento di dati binari e semplifica notevolmente la gestione dei backup logici. In MySQL un tipo di dato simile è costituito dal MEDIUMBLOB. Se siete interessati a approfondire questo argomento, non esitate a contattarmi oppure a partecipare a uno dei corsi 2ndQuadrant su PHP.

This Post Has 0 Comments

Leave A Reply