Come utilizzare il tipo di dati MySQL BLOB per memorizzare le immagini con PHP su Ubuntu 18.04

L’autore ha selezionato le ragazze che codificano per ricevere una donazione come parte del programma Write for DOnations.

Introduzione

Un oggetto binario di grandi dimensioni (BLOB) è un tipo di dati MySQL in grado di memorizzare dati binari come immagini, file multimediali e file PDF.

Quando si creano applicazioni che richiedono un database strettamente accoppiato in cui le immagini devono essere sincronizzate con i dati correlati (ad esempio, un portale per dipendenti, un database per studenti o un’applicazione finanziaria), è possibile memorizzare immagini come le foto e le firme del passaporto degli studenti in un database MySQL insieme ad altre informazioni correlate.

È qui che entra in gioco il tipo di dati MySQL BLOB. Questo approccio di programmazione elimina la necessità di creare un file system separato per la memorizzazione delle immagini. Lo schema centralizza anche il database, rendendolo più portabile e sicuro perché i dati sono isolati dal file system. La creazione di backup è anche più semplice poiché è possibile creare un singolo file di dump MySQL che contiene tutti i dati.

Il recupero dei dati è più veloce e quando si creano record si può essere sicuri che le regole di convalida dei dati e l’integrità referenziale siano mantenute soprattutto quando si utilizzano le transazioni MySQL.

In questo tutorial, si utilizzerà il tipo di dati MySQL BLOB per memorizzare le immagini con PHP su Ubuntu 18.04.

Prerequisiti

Per seguire questa guida, è necessario quanto segue:

  • Un server Ubuntu 18.04 configurato utilizzando la configurazione iniziale del server con Ubuntu 18.04 e un utente non root con privilegi sudo.
  • Apache, MySQL e PHP impostati seguendo la guida su Come installare Linux, Apache, MySQL, PHP (LAMP) stack su Ubuntu 18.04. Per questo tutorial, non è necessario creare host virtuali, quindi puoi saltare il passaggio 4.

Passo 1 — Creazione di un database

Inizierai creando un database di esempio per il tuo progetto. Per fare ciò, SSH nel server e quindi eseguire il seguente comando per accedere al server MySQL come root:

  • sudo mysql -u root -p

Inserisci la password di root del tuo database MySQL e premi ENTER per continuare.

Quindi, eseguire il seguente comando per creare un database. In questo tutorial ci occuperemo nome test_company:

  • CREATE DATABASE test_company;

una Volta creato il database, verrà visualizzato il seguente output:

Output
Query OK, 1 row affected (0.01 sec)

successivamente, creare un test_user account sul server MySQL e ricordarsi di sostituire PASSWORD con una password complessa:

  • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

vedrete il seguente output:

Output
Query OK, 0 rows affected (0.01 sec)

Per concedere test_user pieno di privilegi su test_company database, eseguire:

  • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

assicurarsi che si ottiene il seguente output:

Output
Query OK, 0 rows affected (0.01 sec)

Infine, lavare i privilegi tabella in ordine di MySQL per ricaricare le autorizzazioni:

  • FLUSH PRIVILEGES;

essere sicuri di vedere il seguente output:

Output
Query OK, 0 rows affected (0.01 sec)

Ora che il test_company database e test_user sono pronto, potrai passare alla creazione di un products tabella per la memorizzazione di campioni di prodotti. Utilizzerai questa tabella in seguito per inserire e recuperare i record per dimostrare come funziona MySQL BLOB.

Disconnettersi dal server MySQL:

  • QUIT;

Quindi, accedere nuovamente con le credenziali del test_user che hai creato:

  • mysql -u test_user -p

Quando richiesto, immettere la password per test_user e premere ENTER per continuare. Quindi, passare al database test_company digitando quanto segue:

  • USE test_company;

Una volta selezionato il database test_company, MySQL verrà visualizzato:

Output
Database changed

Quindi, creare una tabella products eseguendo:

  • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

Questo comando crea una tabella denominata products. La tabella ha quattro colonne:

  • product_id: Questa colonna utilizza un tipo di dati BIGINT per contenere un ampio elenco di prodotti fino a un massimo di 2 elementi⁶3-1. La colonna è stata contrassegnata come PRIMARY KEY per identificare in modo univoco i prodotti. Per consentire a MySQL di gestire la generazione di nuovi identificatori per le colonne inserite, è stata utilizzata la parola chiave AUTO_INCREMENT.

  • product_name: Questa colonna contiene i nomi dei prodotti. Hai usato il tipo di dati VARCHAR poiché questo campo generalmente gestisce alfanumerici fino a un massimo di caratteri 50 —il limite di 50 è solo un valore ipotetico utilizzato per lo scopo di questo tutorial.

  • price: A scopo dimostrativo, la tabella products contiene la colonna price per memorizzare il prezzo al dettaglio dei prodotti. Poiché alcuni prodotti possono avere valori fluttuanti (ad esempio, 23.69, 45.36, 102.99), è stato utilizzato il tipo di dati DOUBLE.

  • product_image: Questa colonna utilizza un tipo di dati BLOB per memorizzare i dati binari effettivi delle immagini dei prodotti.

Hai utilizzato InnoDB storage ENGINE per la tabella per supportare una vasta gamma di funzionalità, tra cui le transazioni MySQL. Dopo aver eseguito questo per creare la tabella products, vedrai il seguente output:

Output
Query OK, 0 rows affected (0.03 sec)

Esci dal tuo server MySQL:

  • QUIT;

Otterrai il seguente output

Output
Bye

La tabella products è ora pronta per memorizzare alcuni record incluse le immagini dei prodotti e la popolerai con alcuni prodotti nel passaggio successivo.

Fase 2 — Creazione di script PHP per la connessione e il popolamento del database

In questa fase, si creerà uno script PHP che si connetterà al database MySQL creato nel passaggio 1. Lo script preparerà tre prodotti di esempio e li inserirà nella tabella products.

Per creare il codice PHP, apri un nuovo file con il tuo editor di testo:

  • sudo nano /var/www/html/config.php

Quindi, inserire le seguenti informazioni nel file e sostituire PASSWORD con la password test_user creata nel passaggio 1:

/var/www/html/config.php
<?phpdefine('DB_NAME', 'test_company');define('DB_USER', 'test_user');define('DB_PASSWORD', 'PASSWORD');define('DB_HOST', 'localhost');$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Salva e chiudi il file.

In questo file, hai usato quattro costanti PHP per connetterti al database MySQL che hai creato nel passaggio 1:

  • DB_NAME : Questa costante contiene il nome del database test_company.

  • DB_USER : Questa variabile contiene il nome utente test_user.

  • DB_PASSWORD : Questa costante memorizza MySQL PASSWORD dell’account test_user.

  • DB_HOST: Rappresenta il server in cui risiede il database. In questo caso, si sta utilizzando il server localhost.

La riga seguente nel file avvia un oggetto dati PHP (PDO) e si connette al database MySQL:

...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...

Verso la fine del file, hai impostato un paio di attributi PDO:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: Questo attributo indica a PDO di generare un’eccezione che può essere registrata a scopo di debug.
  • ATTR_EMULATE_PREPARES, false: Questa opzione aumenta la sicurezza dicendo al motore di database MySQL di preparare invece di PDO.

Includerai il file /var/www/html/config.php in due script PHP che creerai successivamente per inserire e recuperare rispettivamente i record.

Innanzitutto, creare lo script PHP /var/www/html/insert_products.php per inserire i record nella tabella products:

  • sudo nano /var/www/html/insert_products.php

Quindi, aggiungere le seguenti informazioni nel file /var/www/html/insert_products.php:

/var/www/html/insert_products.php
<?phprequire_once 'config.php';$products = ;$products = ;$products = ;$products = ;$sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)";foreach ($products as $product) { $stmt = $pdo->prepare($sql); $stmt->execute($product);}echo "Records inserted successfully";

Salva e chiudi il file.

Nel file, hai incluso il file config.php nella parte superiore. Questo è il primo file creato per definire le variabili del database e connettersi al database. Il file avvia anche un oggetto PDO e lo memorizza in una variabile $pdo.

Successivamente, è stato creato un array di dati dei prodotti da inserire nel database. A parte product_name e price, che sono preparati rispettivamente come stringhe e valori numerici, lo script utilizza la funzione file_get_contents integrata in PHP per leggere le immagini da una sorgente esterna e passarle come stringhe alla colonna product_image.

Successivamente, è stata preparata un’istruzione SQL e utilizzata l’istruzione PHP foreach{...} per inserire ciascun prodotto nel database.

Per eseguire il file /var/www/html/insert_products.php, eseguirlo nella finestra del browser utilizzando il seguente URL. Ricordarsi di sostituire your-server-IP con l’indirizzo IP pubblico del server:

http://your-server-IP/insert_products.php

Dopo aver eseguito il file, verrà visualizzato un messaggio di successo nel browser che conferma che i record sono stati inseriti nel database.

Un messaggio di successo che indica che i record sono stati inseriti nel database

Sono stati inseriti correttamente tre record contenenti immagini del prodotto nella tabella products. Nel passaggio successivo, creerai uno script PHP per recuperare questi record e visualizzarli nel tuo browser.

Passo 3 — Visualizzazione delle informazioni dei prodotti dal database MySQL

Con le informazioni e le immagini dei prodotti nel database, ora stai andando a codificare un altro script PHP che interroga e visualizza le informazioni dei prodotti in una tabella HTML sul tuo browser.

Per creare il file, digitare quanto segue:

  • sudo nano /var/www/html/display_products.php

Quindi, inserire le seguenti informazioni nel file:

/var/www/html/display_products.php
<html> <title>Using BLOB and MySQL</title> <body> <?php require_once 'config.php'; $sql = "SELECT * FROM products"; $stmt = $pdo->prepare($sql); $stmt->execute(); ?> <table border = '1' align = 'center'> <caption>Products Database</caption> <tr> <th>Product Id</th> <th>Product Name</th> <th>Price</th> <th>Product Image</th> </tr> <?php while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo '<tr>'; echo '<td>' . $row . '</td>'; echo '<td>' . $row . '</td>'; echo '<td>' . $row . '</td>'; echo '<td>' . '<img src = "data:image/png;base64,' . base64_encode($row) . '" width = "50px" height = "50px"/>' . '</td>'; echo '</tr>'; } ?> </table> </body></html>

Salva le modifiche al file e chiudilo.

Qui hai nuovamente incluso il file config.php per connetterti al database. Quindi, è stata preparata ed eseguita un’istruzione SQL utilizzando PDO per recuperare tutti gli elementi dalla tabella products utilizzando il comando SELECT * FROM products.

Successivamente, è stata creata una tabella HTML e popolata con i dati dei prodotti utilizzando l’istruzione PHP while() {...}. La riga $row = $stmt->fetch(PDO::FETCH_ASSOC) interroga il database e memorizza il risultato nella variabile $row come array multidimensionale, che è stato quindi visualizzato in una colonna della tabella HTML utilizzando la sintassi $row.

Le immagini della colonna product_image sono racchiuse all’interno dei tag <img src = "">. Sono stati utilizzati gli attributi width e height per ridimensionare le immagini a una dimensione più piccola che può essere inserita nella colonna della tabella HTML.

Per convertire i dati detenuti dal tipo di dati BLOB in immagini, è stata utilizzata la funzione PHP base64_encode integrata e la seguente sintassi per lo schema URI dati:

data:media_type;base64, base_64_encoded_data

In questo caso, image/png è media_type e la stringa codificata Base64 dalla colonna product_image è base_64_encoded_data.

Quindi, eseguire il file display_products.php in un browser Web digitando il seguente indirizzo:

http://your-server-IP/display_products.php

Dopo aver eseguito il file display_products.php nel browser, verrà visualizzata una tabella HTML con un elenco di prodotti e immagini associate.

Elenco dei prodotti dal database MySQL

Ciò conferma che lo script PHP per il recupero delle immagini da MySQL funziona come previsto.

Conclusione

In questa guida, è stato utilizzato il tipo di dati MySQL BLOB per memorizzare e visualizzare le immagini con PHP su Ubuntu 18.04. Hai anche visto i vantaggi di base della memorizzazione delle immagini in un database anziché memorizzarle in un file system. Questi includono portabilità, sicurezza e facilità di backup. Se stai costruendo un’applicazione come un portale per studenti o un database di dipendenti che richiede informazioni e immagini correlate da archiviare insieme, questa tecnologia può essere di grande utilità per te.

Per ulteriori informazioni sui tipi di dati supportati in MySQL seguire la guida MySQL Data Types. Se sei interessato a ulteriori contenuti relativi a MySQL e PHP, controlla i seguenti tutorial:

  • Come implementare l’impaginazione in MySQL con PHP su Ubuntu 18.04
  • Come utilizzare l’estensione PHP PDO per eseguire transazioni MySQL in PHP su Ubuntu 18.04

Leave a Reply

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.