Corsi on-line

Estrarre immagini da un database MySQL senza errori

Archiviare immagini all’interno di un database MySQL utilizzando un campo associato ad un tipo di dato BLOB non richiede una procedura particolarmente complicata; lo stesso potrebbe dirsi per quanto riguarda le fasi di estrazione e visualizzazione delle immagini memorizzate, in questo caso infatti è sufficiente introdurre il corretto Content-Type tramite la funzione header() e poi stampare a video la risorsa selezionata.

La questione si fa più complessa nel caso in cui si vogliano visualizzare i contenuti di altri campi insieme all’immagine, questo perché uno snippet come il seguente non produce una vera e propria pagina Web ma un output grafico:

header('Content-Type: image/jpeg');
echo $result['img'];

Vi è poi il fatto che header() non permette la presenza di altri output prima del suo utilizzo, per cui anche la sola presenza di intestazioni HTML determinerebbe la produzioni di errori da parte del parser di PHP. Queste problematiche sono comunque risolvibili con alcuni accorgimenti che ho riassunto in un’applicazione d’esempio dove le interrogazioni al Database engine vengono effettuate tramite PDO.

Il primo snippet riguarda il codice per la connessione a MySQL da inserire in una pagina (“cfg.php”) che poi potrà essere inclusa dagli altri file dello script; il sorgente contiene anche una variabile (“$img_id”) associata all’ID del record coinvolto dalla SELECT:

$cn = new PDO('mysql:host=localhost;dbname=nome_db' , '***', '***');
$img_id = 1;

Il codice seguente (file “img.php”) presenta invece le istruzioni necessarie per l’estrazione e la stampa a video dell’immagine corrispondente all’ID definito nel file precedente:

include "cfg.php";
$sql = $cn->prepare("SELECT img FROM schedario WHERE id = :img_id");
$sql->bindParam(':img_id', $img_id, PDO::PARAM_INT);
$sql->execute();
$result = $sql->fetch(PDO::FETCH_ASSOC);
header('Content-Type: image/jpeg');
echo $result['img'];

Infine, il file “index.php” conterrà il sorgente relativo alla visualizzazione dell’immagine e all’estrazione degli altri campi in tabella; si osservi come il file “img.php” venga richiamato tramite tags “img src” come se si trattasse di una comune componente grafica.

include 'cfg.php';
echo '<img src="img.php"><br />';
$sql = $cn->prepare("SELECT nome,cognome FROM schedario WHERE id = :img_id");
$sql->bindParam(':img_id', $img_id, PDO::PARAM_INT);
$sql->execute();
$result = $sql->fetchAll();
foreach($result as $row)
{
echo $row['nome'] . ' - ' . $row['cognome'];
}

In questo modo l’output di “cfg.php” verrà visualizzato in seguito ad una chiamata per inclusione (come accadrebbe per una qualsiasi immagine non prodotta dinamicamente), per cui potrà essere normalmente incluso in qualsiasi file “.php” anche in presenza di output precedenti e permettendo l’estrazione di ulteriori valori associati a tipi di dato differenti.

Post correlati
I più letti del mese
Tematiche