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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputDatabase 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 datatypBIGINT
för att rymma en stor lista med produkter upp till maximalt 2 m3-1-objekt. Du har markerat kolumnen somPRIMARY 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 nyckelordetAUTO_INCREMENT
. -
product_name
: den här kolumnen innehåller namnen på produkterna. Du har använt datatypenVARCHAR
eftersom det här fältet i allmänhet hanterar alfanumerik upp till maximalt50
tecken—gränsen för50
är bara ett hypotetiskt värde som används för syftet med denna handledning. -
price
: för demonstrationsändamål innehåller dinproducts
– tabell kolumnenprice
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 datatypenDOUBLE
. -
product_image
: den här kolumnen använder en datatypBLOB
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:
OutputQuery OK, 0 rows affected (0.03 sec)
logga ut från din MySQL-server:
- QUIT;
du får följande utdata
OutputBye
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:
<?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å databasentest_company
. -
DB_USER
: den här variabeln innehåller användarnamnettest_user
. -
DB_PASSWORD
: denna konstant lagrar MySQLPASSWORD
förtest_user
– kontot. -
DB_HOST
: detta representerar servern där databasen finns. I det här fallet använder dulocalhost
– 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
:
<?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.
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:
<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.
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