så här använder du MySQL BLOB-datatypen för att lagra bilder med PHP på Ubuntu 18.04

författaren valde tjejer som kodar för att få en donation som en del av Write for DOnations-programmet.

introduktion

ett binärt stort objekt (BLOB) är en MySQL-datatyp som kan lagra binära data som bilder, multimedia och PDF-filer.

när du skapar applikationer som kräver en tätt kopplad databas där bilder ska synkroniseras med relaterad data (till exempel en anställdportal, en studentdatabas eller en ekonomisk applikation) kan det vara bekvämt att lagra bilder som studenters passfoton och signaturer i en MySQL-databas tillsammans med annan relaterad information.

det är här datatypen MySQL BLOB kommer in. Denna programmeringsmetod eliminerar behovet av att skapa ett separat filsystem för lagring av bilder. Systemet centraliserar också databasen, vilket gör den mer bärbar och säker eftersom data är isolerade från filsystemet. Att skapa säkerhetskopior är också mer sömlöst eftersom du kan skapa en enda MySQL-dumpfil som innehåller alla dina data.

att hämta data går snabbare, och när du skapar poster kan du vara säker på att datavalideringsregler och referensintegritet upprätthålls, särskilt när du använder MySQL-transaktioner.

i denna handledning använder du datatypen MySQL BLOB för att lagra bilder med PHP på Ubuntu 18.04.

förutsättningar

för att följa med den här guiden behöver du följande:

  • en Ubuntu 18.04-server konfigurerad med den ursprungliga Serverinställningen med Ubuntu 18.04 och en icke-root-användare med sudo – privilegier.
  • Apache, MySQL och PHP Ställ in genom att följa guiden om hur du installerar Linux, Apache, MySQL, PHP (LAMP) stack på Ubuntu 18.04. För denna handledning är det inte nödvändigt att skapa virtuella värdar, så du kan hoppa över steg 4.

Steg 1 — Skapa en databas

du börjar med att skapa en exempeldatabas för ditt projekt. För att göra detta, SSH in på din server och kör sedan följande kommando för att logga in på din MySQL-server som root:

  • sudo mysql -u root -p

ange root-lösenordet för din MySQL-databas och tryck ENTER för att fortsätta.

kör sedan följande kommando för att skapa en databas. I denna handledning kommer vi att namnge den test_company:

  • CREATE DATABASE test_company;

när databasen har skapats ser du följande utdata:

Output
Query OK, 1 row affected (0.01 sec)

skapa sedan ett test_user – konto på MySQL-servern och kom ihåg att ersätta PASSWORD med ett starkt lösenord:

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

du ser följande utdata:

Output
Query OK, 0 rows affected (0.01 sec)

för att bevilja test_user fullständiga behörigheter i databasen test_company, kör:

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

se till att du får följande utdata:

Output
Query OK, 0 rows affected (0.01 sec)

slutligen spola behörighetstabellen för att MySQL ska ladda om behörigheterna:

  • FLUSH PRIVILEGES;

se till att du ser följande utdata:

Output
Query OK, 0 rows affected (0.01 sec)

nu när test_company – databasen och test_user är klara, går du vidare till att skapa en products – tabell för lagring av provprodukter. Du använder den här tabellen senare för att infoga och hämta poster för att visa hur MySQL BLOB fungerar.

logga ut från MySQL-servern:

  • QUIT;

logga sedan in igen med autentiseringsuppgifterna för test_user som du skapade:

  • mysql -u test_user -p

när du blir ombedd anger du lösenordet för test_user och trycker på ENTER för att fortsätta. Byt sedan till databasen test_company genom att skriva följande:

  • USE test_company;

när databasen test_company har valts visas MySQL:

Output
Database changed

skapa sedan en products – tabell genom att köra:

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

detta kommando skapar en tabell med namnet products. Tabellen har fyra kolumner:

  • product_id: Den här kolumnen använder en datatyp BIGINT för att rymma en stor lista med produkter upp till maximalt 2 m3-1-objekt. Du har markerat kolumnen som PRIMARY KEY för att unikt identifiera produkter. För att MySQL ska kunna hantera genereringen av nya identifierare för infogade kolumner har du använt nyckelordet AUTO_INCREMENT.

  • product_name: den här kolumnen innehåller namnen på produkterna. Du har använt datatypen VARCHAR eftersom det här fältet i allmänhet hanterar alfanumerik upp till maximalt 50 tecken—gränsen för 50 är bara ett hypotetiskt värde som används för syftet med denna handledning.

  • price: för demonstrationsändamål innehåller din products – tabell kolumnen price för att lagra detaljhandelspriset för produkter. Eftersom vissa produkter kan ha flytande värden (till exempel 23.69, 45.36, 102.99) har du använt datatypen DOUBLE.

  • product_image: den här kolumnen använder en datatyp BLOB för att lagra de faktiska binära data för produkternas bilder.

du har använt InnoDB Lagring ENGINE för tabellen för att stödja ett brett utbud av funktioner, inklusive MySQL-transaktioner. När du har kört detta för att skapa tabellen products ser du följande utdata:

Output
Query OK, 0 rows affected (0.03 sec)

logga ut från din MySQL-server:

  • QUIT;

du får följande utdata

Output
Bye

tabellen products är nu redo att lagra vissa poster inklusive produktbilder och du fyller den med vissa produkter i nästa steg.

steg 2-Skapa PHP-skript för att ansluta och fylla i databasen

i det här steget skapar du ett PHP-skript som kommer att ansluta till MySQL-databasen som du skapade i steg 1. Skriptet kommer att förbereda tre provprodukter och infoga dem i tabellen products.

för att skapa PHP-koden, öppna en ny fil med din textredigerare:

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

ange sedan följande information i filen och ersätt PASSWORD med lösenordet test_user som du skapade i steg 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);

spara och stäng filen.

i den här filen har du använt fyra PHP-konstanter för att ansluta till MySQL-databasen som du skapade i Step 1:

  • DB_NAME : denna konstant har namnet på databasen test_company.

  • DB_USER : den här variabeln innehåller användarnamnet test_user.

  • DB_PASSWORD : denna konstant lagrar MySQL PASSWORD för test_user – kontot.

  • DB_HOST: detta representerar servern där databasen finns. I det här fallet använder du localhost – servern.

följande rad i din fil initierar ett PHP – dataobjekt (PDO) och ansluter till MySQL-databasen:

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

mot slutet av filen har du ställt in ett par PDO-attribut:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: Detta attribut instruerar PDO att kasta ett undantag som kan loggas för felsökningsändamål.
  • ATTR_EMULATE_PREPARES, false: det här alternativet ökar säkerheten genom att berätta för MySQL-databasmotorn att förbereda istället för PDO.

du inkluderar filen /var/www/html/config.php i två PHP-skript som du skapar nästa för att infoga respektive hämta poster.

skapa först /var/www/html/insert_products.php PHP-skriptet för att infoga poster i tabellen Produkter:

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

lägg sedan till följande information i filen /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";

spara och stäng filen.

i filen har du inkluderat filen config.php högst upp. Det här är den första filen du skapade för att definiera databasvariablerna och ansluta till databasen. Filen initierar också ett PDO-objekt och lagrar det i en $pdo variabel.

därefter har du skapat en array av produkternas data som ska infogas i databasen. Förutom product_name och price, som är förberedda som strängar respektive numeriska värden, använder skriptet PHP: s inbyggda file_get_contents-funktion för att läsa bilder från en extern källa och skicka dem som strängar till kolumnen product_image.

därefter har du förberett en SQL-sats och använt PHP foreach{...} – satsen för att infoga varje produkt i databasen.

för att köra filen /var/www/html/insert_products.php, kör den i ditt webbläsarfönster med följande URL. Kom ihåg att ersätta your-server-IP med den offentliga IP-adressen för din server:

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

när du har kört filen ser du ett framgångsmeddelande i din webbläsare som bekräftar att poster har infogats i databasen.

ett framgångsmeddelande som visar att poster infogades i databasen

du har infogat tre poster som innehåller produktbilder i tabellen products. I nästa steg skapar du ett PHP-skript för att hämta dessa poster och visa dem i din webbläsare.

steg 3-visa produktinformation från MySQL-databasen

med produktinformation och bilder i databasen kommer du nu att koda ett annat PHP-skript som frågar och visar produktinformation i en HTML-tabell i din webbläsare.

för att skapa filen, skriv följande:

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

ange sedan följande information i filen:

/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>

spara ändringarna i filen och stäng den.

här har du återigen inkluderat filen config.php för att ansluta till databasen. Sedan har du förberett och exekverat ett SQL-uttryck med PDO för att hämta alla objekt från products – tabellen med kommandot SELECT * FROM products.

därefter har du skapat en HTML-tabell och fyllt den med produkternas data med PHP while() {...} – satsen. Raden $row = $stmt->fetch(PDO::FETCH_ASSOC) frågar databasen och lagrar resultatet i variabeln $row som en flerdimensionell array, som du sedan har visat i en HTML-tabellkolumn med syntaxen $row.

bilderna från kolumnen product_image är inneslutna i taggarna <img src = "">. Du har använt attributen width och height för att ändra storlek på bilderna till en mindre storlek som kan passa i HTML-tabellkolumnen.

för att konvertera data som innehas av datatypen BLOB tillbaka till bilder har du använt den inbyggda PHP base64_encode – funktionen och följande syntax för Data-URI-schemat:

data:media_type;base64, base_64_encoded_data

i det här fallet är image/png media_type och den Base64 kodade strängen från kolumnen product_image är base_64_encoded_data.

kör sedan filen display_products.php i en webbläsare genom att skriva följande adress:

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

när du har kört filen display_products.php i din webbläsare ser du en HTML-tabell med en lista över produkter och tillhörande bilder.

lista över produkter från MySQL-databasen

detta bekräftar att PHP-skriptet för att hämta bilder från MySQL fungerar som förväntat.

slutsats

i den här guiden använde du datatypen MySQL BLOB för att lagra och visa bilder med PHP på Ubuntu 18.04. Du har också sett de grundläggande fördelarna med att lagra bilder i en databas i motsats till att lagra dem i ett filsystem. Dessa inkluderar portabilitet, säkerhet och enkel säkerhetskopiering. Om du bygger en applikation som en studentportal eller anställdas databas som kräver att information och relaterade bilder lagras tillsammans, kan den här tekniken vara till stor nytta för dig.

för mer information om de datatyper som stöds i MySQL följ MySQL datatyper guide. Om du är intresserad av ytterligare innehåll relaterat till MySQL och PHP, kolla in följande handledning:

  • hur man implementerar Pagination i MySQL med PHP på Ubuntu 18.04
  • hur man använder PDO PHP-tillägget för att utföra MySQL-transaktioner i PHP på Ubuntu 18.04

Lämna ett svar

Lämna ett svar

Din e-postadress kommer inte publiceras.