forfatteren valgte Jenter Som Kode for å motta en donasjon som en del Av Write For DOnations-programmet.
Innledning
Et Binært Stort Objekt (BLOB
) Er En MySQL-datatype som kan lagre binære data som bilder, multimedia og PDF-filer.
når du oppretter programmer som krever en tett koblet database der bilder skal synkroniseres med relaterte data (for eksempel en ansattportal, en studentdatabase eller en økonomisk applikasjon), kan det være praktisk å lagre bilder som studenters passbilder og signaturer i En MySQL-database sammen med annen relatert informasjon.
Dette er Hvor MySQL BLOB
datatypen kommer inn. Denne programmeringsmetoden eliminerer behovet for å lage et eget filsystem for lagring av bilder. Ordningen sentraliserer også databasen, noe som gjør den mer bærbar og sikker fordi dataene er isolert fra filsystemet. Å lage sikkerhetskopier er også mer sømløs siden du kan lage en Enkelt MySQL dumpfil som inneholder alle dataene dine.
Henting av data er raskere, og når du oppretter poster, kan du være sikker på at datavalideringsregler og referanseintegritet opprettholdes, spesielt når Du bruker MySQL-transaksjoner.
i denne opplæringen vil Du bruke MySQL BLOB
datatypen til å lagre bilder MED PHP På Ubuntu 18.04.
Forutsetninger
for å følge denne veiledningen trenger du følgende:
- En Ubuntu 18.04-server konfigurert ved Hjelp Av Det Første Serveroppsettet Med Ubuntu 18.04 og en ikke-rotbruker med
sudo
privilegier. - Apache, MySQL og PHP satt opp ved å følge veiledningen Om Hvordan Du Installerer Linux, Apache, MySQL, PHP (LAMP) stack På Ubuntu 18.04. For denne opplæringen er det ikke nødvendig å opprette virtuelle verter, så du kan hoppe Over Trinn 4.
Trinn 1 — Opprette En Database
du starter med å opprette en eksempeldatabase for prosjektet. FOR å gjøre DETTE, SSH på serveren din og kjør deretter følgende kommando for å logge på MySQL-serveren som rot:
- sudo mysql -u root -p
Skriv inn rotpassordet Til MySQL-databasen og trykk ENTER
for å fortsette.
kjør deretter følgende kommando for å opprette en database. I denne opplæringen vil vi nevne det test_company
:
- CREATE DATABASE test_company;
når databasen er opprettet, vil du se følgende utdata:
OutputQuery OK, 1 row affected (0.01 sec)
deretter oppretter du en test_user
– konto på MySQL-serveren og husk å erstatte PASSWORD
med et sterkt passord:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
du vil se følgende utdata:
OutputQuery OK, 0 rows affected (0.01 sec)
hvis du vil gi test_user
fullstendige rettigheter på test_company
– databasen, kjører du:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
Pass på at du får følgende utdata:
OutputQuery OK, 0 rows affected (0.01 sec)
til slutt, skyll privilegietabellen for At MySQL skal laste inn tillatelsene:
- FLUSH PRIVILEGES;
Kontroller at du ser følgende utdata:
OutputQuery OK, 0 rows affected (0.01 sec)
Nå som test_company
– databasen og test_user
er klare, går du videre til å lage et products
– bord for lagring av prøveprodukter. Du bruker denne tabellen senere til å sette inn og hente poster for å demonstrere Hvordan MySQL BLOB
fungerer.
Logg Ut Fra MySQL-serveren:
- QUIT;
logg deretter på igjen med legitimasjonen til test_user
du opprettet:
- mysql -u test_user -p
når du blir bedt om det, skriv inn passordet for test_user
og trykk ENTER
for å fortsette. Deretter bytter du til test_company
– databasen ved å skrive inn følgende:
- USE test_company;
Når test_company
databasen er valgt, Vil MySQL vise:
OutputDatabase changed
deretter oppretter du en tabell products
ved å kjøre:
- CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;
denne kommandoen oppretter en tabell med navnet products
. Tabellen har fire kolonner:
-
product_id
: Denne kolonnen bruker en datatypeBIGINT
for å imøtekomme en stor liste over produkter opptil maksimalt 23-1 elementer. Du har merket kolonnen somPRIMARY KEY
for å identifisere produkter unikt. For At MySQL skal kunne håndtere genereringen av nye identifikatorer for innsatte kolonner, har du brukt søkeordetAUTO_INCREMENT
. -
product_name
: denne kolonnen inneholder navnene på produktene. Du har brukt datatypenVARCHAR
siden dette feltet vanligvis håndterer alfanumerikk opp til maksimalt50
tegn-grensen på50
er bare en hypotetisk verdi som brukes til formålet med denne opplæringen. -
price
: for demonstrasjonsformål inneholder tabellenproducts
kolonnenprice
for å lagre utsalgsprisen på produkter. Siden enkelte produkter kan ha flytende verdier(for eksempel 23,69, 45,36, 102,99), har du brukt datatypenDOUBLE
. -
product_image
: denne kolonnen bruker en datatypeBLOB
til å lagre de faktiske binære dataene for produktenes bilder.
du har brukt InnoDB
lagring ENGINE
for tabellen for å støtte et bredt spekter av funksjoner, inkludert MySQL-transaksjoner. Etter å ha utført dette for å lage products
– tabellen, ser du følgende utdata:
OutputQuery OK, 0 rows affected (0.03 sec)
Logg ut Fra MySQL-serveren din:
- QUIT;
du får følgende utgang
OutputBye
products
tabellen er nå klar til å lagre noen poster, inkludert produktbilder, og du vil fylle den med noen produkter i neste trinn.
Trinn 2-Opprette PHP-Skript For Å Koble til Og Fylle Databasen
i dette trinnet oppretter DU ET PHP-skript som vil koble Til MySQL-databasen du opprettet I Trinn 1. Skriptet vil forberede tre prøveprodukter og sette dem inn i tabellen products
.
Åpne EN ny fil med tekstredigeringsprogrammet for Å opprette PHP-koden:
- sudo nano /var/www/html/config.php
deretter skriver du inn følgende informasjon i filen og erstatter PASSWORD
med test_user
passordet du opprettet I Trinn 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);
Lagre og lukk filen.
i denne filen har du brukt fire PHP-konstanter til å koble Til MySQL-databasen du opprettet I Trinn 1:
-
DB_NAME
: denne konstanten inneholder navnet på databasentest_company
. -
DB_USER
: denne variabelen inneholder brukernavnettest_user
. -
DB_PASSWORD
: denne konstanten lagrer MySQLPASSWORD
avtest_user
– kontoen. -
DB_HOST
: dette representerer serveren der databasen ligger. I dette tilfellet bruker dulocalhost
– serveren .
følgende linje i filen starter ET PHP Data Object (PUD) og kobles Til MySQL-databasen:
...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...
Mot slutten av filen har du satt et par PUD-attributter:
-
ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
: Dette attributtet instruerer PDO å kaste et unntak som kan logges for feilsøkingsformål. -
ATTR_EMULATE_PREPARES, false
: dette alternativet øker sikkerheten ved å fortelle MySQL-databasemotoren å gjøre prepare i stedet for PUD.
du vil inkludere /var/www/html/config.php
– filen i TO PHP-skript som du vil opprette neste for å sette inn og hente poster henholdsvis.
opprett FØRST PHP-skriptet /var/www/html/insert_products.php
for å sette inn poster i produkttabellen:
- sudo nano /var/www/html/insert_products.php
deretter legger du til følgende informasjon 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";
Lagre og lukk filen.
i filen har du tatt med config.php
– filen øverst. Dette er den første filen du opprettet for å definere databasevariablene og koble til databasen. Filen starter også ET PUD-objekt og lagrer det i en $pdo
variabel.
deretter har du opprettet en matrise av produktdataene som skal settes inn i databasen. Bortsett fra product_name
og price
, som er utarbeidet som henholdsvis strenger og numeriske verdier, bruker skriptet PHPS innebygde file_get_contents
– funksjon for å lese bilder fra en ekstern kilde og sende dem som strenger til kolonnen product_image
.
deretter har du utarbeidet EN SQL-setning og brukt PHP foreach{...}
– setningen for å sette inn hvert produkt i databasen.
for å utføre filen /var/www/html/insert_products.php
, kjør den i nettleservinduet ved hjelp av FØLGENDE URL. Husk å erstatte your-server-IP
med den offentlige IP-adressen til serveren din:
http://your-server-IP/insert_products.php
etter å ha kjørt filen, vil du se en suksessmelding i nettleseren din som bekrefter at poster ble satt inn i databasen.
du har satt inn tre poster som inneholder produktbilder i tabellen products
. I neste trinn oppretter DU ET PHP-skript for å hente disse postene og vise dem i nettleseren din.
Trinn 3-Vise Produktinformasjon Fra MySQL-Databasen
med produktinformasjon og bilder i databasen, skal du nå kode et ANNET PHP-skript som spør og viser produktinformasjonen i ET HTML-bord i nettleseren din.
skriv inn følgende for å opprette filen:
- sudo nano /var/www/html/display_products.php
deretter skriver du inn følgende informasjon 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>
Lagre endringene i filen og lukk den.
her har du igjen tatt med config.php
– filen for å koble til databasen. Deretter har du forberedt OG utført EN SQL-setning ved HJELP AV PDO for å hente alle elementer fra tabellen products
ved hjelp av kommandoen SELECT * FROM products
.
deretter har du opprettet EN HTML-tabell og fylt den med produktdataene ved HJELP AV PHP while() {...}
– setningen. Linjen $row = $stmt->fetch(PDO::FETCH_ASSOC)
spør databasen og lagrer resultatet i $row
– variabelen som en flerdimensjonal matrise, som du deretter har vist i EN HTML – tabellkolonne ved hjelp av syntaksen $row
.
bildene fra kolonnen product_image
er vedlagt i <img src = "">
– kodene. Du har brukt attributtene width
og height
til å endre størrelsen på bildene til en mindre størrelse som får plass i HTML-tabellkolonnen.
for å konvertere dataene som holdes av datatypen BLOB
tilbake til bilder, har du brukt DEN innebygde PHP base64_encode
– funksjonen og følgende syntaks for Data URI-skjemaet:
data:media_type;base64, base_64_encoded_data
i dette tilfellet er image/png
media_type
og den Base64
kodede strengen fra kolonnen product_image
base_64_encoded_data
.
kjør deretter display_products.php
– filen i en nettleser ved å skrive inn følgende adresse:
http://your-server-IP/display_products.php
etter å ha kjørt display_products.php
– filen i nettleseren din, vil du se ET HTML-bord med en liste over produkter og tilhørende bilder.
dette bekrefter AT PHP-skriptet for henting av bilder fra MySQL fungerer som forventet.
Konklusjon
i denne veiledningen brukte Du MySQL BLOB
datatypen til å lagre og vise bilder MED PHP på Ubuntu 18.04. Du har også sett de grunnleggende fordelene ved å lagre bilder i en database i motsetning til å lagre dem i et filsystem. Disse inkluderer portabilitet, sikkerhet og enkel sikkerhetskopiering. Hvis du bygger et program som en studentportal eller en ansattdatabase som krever at informasjon og relaterte bilder lagres sammen, kan denne teknologien være til stor nytte for deg.
for mer informasjon om de støttede datatypene i MySQL følg mysql Datatyper guide. Hvis du er interessert i ytterligere innhold knyttet Til MySQL og PHP, sjekk ut følgende opplæringsprogrammer:
- Slik Implementerer Du Paginering I MySQL med PHP På Ubuntu 18.04
- Slik Bruker DU PDO PHP-Utvidelsen Til Å Utføre MySQL-Transaksjoner I PHP på Ubuntu 18.04