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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputDatabase 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 datiBIGINT
per contenere un ampio elenco di prodotti fino a un massimo di 2 elementi⁶3-1. La colonna è stata contrassegnata comePRIMARY 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 chiaveAUTO_INCREMENT
. -
product_name
: Questa colonna contiene i nomi dei prodotti. Hai usato il tipo di datiVARCHAR
poiché questo campo generalmente gestisce alfanumerici fino a un massimo di caratteri50
—il limite di50
è solo un valore ipotetico utilizzato per lo scopo di questo tutorial. -
price
: A scopo dimostrativo, la tabellaproducts
contiene la colonnaprice
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 datiDOUBLE
. -
product_image
: Questa colonna utilizza un tipo di datiBLOB
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:
OutputQuery OK, 0 rows affected (0.03 sec)
Esci dal tuo server MySQL:
- QUIT;
Otterrai il seguente output
OutputBye
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:
<?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 databasetest_company
. -
DB_USER
: Questa variabile contiene il nome utentetest_user
. -
DB_PASSWORD
: Questa costante memorizza MySQLPASSWORD
dell’accounttest_user
. -
DB_HOST
: Rappresenta il server in cui risiede il database. In questo caso, si sta utilizzando il serverlocalhost
.
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
:
<?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.
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:
<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.
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