forfatteren valgte piger, der koder for at modtage en donation som en del af programmet Skriv til donationer.
introduktion
et binært stort objekt (BLOB
) er en datatype, der kan gemme binære data såsom billeder, multimedier og PDF-filer.
når du opretter programmer, der kræver en tæt koblet database, hvor billeder skal være synkroniseret med relaterede data (f.eks. en medarbejderportal, en studenterdatabase eller en finansiel applikation), kan det være praktisk at gemme billeder som f. eks. elevernes pasfotos og underskrifter i en Microsoft-database sammen med andre relaterede oplysninger.
det er her, hvor datatypen Myskl BLOB
kommer ind. Denne programmeringsmetode eliminerer behovet for at oprette et separat filsystem til lagring af billeder. Ordningen centraliserer også databasen, hvilket gør den mere bærbar og sikker, fordi dataene er isoleret fra filsystemet. Oprettelse af sikkerhedskopier er også mere problemfri, da du kan oprette en enkelt dump-fil, der indeholder alle dine data.
det er hurtigere at hente data, og når du opretter poster, kan du være sikker på, at datavalideringsregler og referenceintegritet opretholdes, især når du bruger Myskl-transaktioner.
i denne vejledning bruger du datatypen Myskl BLOB
til at gemme billeder med PHP på Ubuntu 18.04.
forudsætninger
for at følge med i denne vejledning skal du bruge følgende:
- en Ubuntu 18.04-server konfigureret ved hjælp af den oprindelige serveropsætning med Ubuntu 18.04 og en ikke-root-bruger med
sudo
privilegier. - Apache, PHP og PHP er oprettet ved at følge vejledningen om, hvordan du installerer Ubuntu 18.04. Til denne tutorial er det ikke nødvendigt at oprette virtuelle værter, så du kan springe trin 4 over.
Trin 1 — Oprettelse af en Database
du starter med at oprette en eksempeldatabase til dit projekt. For at gøre dette skal du SSH ind på din server og derefter køre følgende kommando for at logge ind på din Myscl-server som root:
- sudo mysql -u root -p
indtast rodadgangskoden til din database, og tryk på ENTER
for at fortsætte.
kør derefter følgende kommando for at oprette en database. I denne tutorial navngiver vi det test_company
:
- CREATE DATABASE test_company;
når databasen er oprettet, vil du se følgende output:
OutputQuery OK, 1 row affected (0.01 sec)
opret derefter en test_user
konto på serveren og husk at erstatte PASSWORD
med en stærk adgangskode:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
du vil se følgende output:
OutputQuery OK, 0 rows affected (0.01 sec)
at give test_user
fuld privilegier på test_company
database, Kør:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
sørg for, at du får følgende output:
OutputQuery OK, 0 rows affected (0.01 sec)
til sidst skal du skylle privilegietabellen, så du kan genindlæse tilladelserne:
- FLUSH PRIVILEGES;
sørg for, at du ser følgende output:
OutputQuery OK, 0 rows affected (0.01 sec)
nu hvor test_company
databasen og test_user
er klar, går du videre til at oprette en products
tabel til lagring af prøveprodukter. Du kan bruge denne tabel senere til at indsætte og hente poster for at vise, hvordan 3343 fungerer.
Log ud fra serveren:
- QUIT;
log derefter ind igen med legitimationsoplysningerne til test_user
, som du oprettede:
- mysql -u test_user -p
når du bliver bedt om det, skal du indtaste adgangskoden til test_user
og trykke på ENTER
for at fortsætte. Skift derefter til test_company
databasen ved at skrive følgende:
- USE test_company;
når test_company
databasen er valgt, vises:
OutputDatabase changed
opret derefter en products
tabel ved at køre:
- CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;
denne kommando opretter en tabel med navnet products
. Tabellen har fire kolonner:
-
product_id
: Denne kolonne bruger en datatypeBIGINT
til at rumme en stor liste over produkter på op til maksimalt 2 oversættelse3-1-elementer. Du har markeret kolonnen somPRIMARY KEY
for entydigt at identificere produkter. For at kunne håndtere genereringen af nye identifikatorer for indsatte kolonner, har du brugt søgeordetAUTO_INCREMENT
. -
product_name
: denne kolonne indeholder navnene på produkterne. Du har brugt datatypenVARCHAR
, da dette felt generelt håndterer alfanumerik op til maksimalt50
tegn—grænsen på50
er kun en hypotetisk værdi, der bruges til formålet med denne tutorial. -
price
: til demonstrationsformål indeholder tabellenproducts
kolonnenprice
til lagring af detailprisen for produkter. Da nogle produkter kan have flydende værdier (for eksempel 23.69, 45.36, 102.99), har du brugt datatypenDOUBLE
. -
product_image
: denne kolonne bruger enBLOB
datatype til at gemme de faktiske binære data for produkternes billeder.
du har brugt InnoDB
opbevaring ENGINE
til tabellen til at understøtte en lang række funktioner, herunder transaktioner. Når du har udført dette for at oprette products
tabellen, vil du se følgende output:
OutputQuery OK, 0 rows affected (0.03 sec)
Log ud fra din server:
- QUIT;
du får følgende output
OutputBye
tabellen products
er nu klar til at gemme nogle poster inklusive produkters billeder, og du udfylder det med nogle produkter i næste trin.
Trin 2 — Oprettelse af PHP-Scripts til tilslutning og udfyldning af databasen
i dette trin opretter du et PHP-script, der opretter forbindelse til den PHP-database, du oprettede i Trin 1. Scriptet vil forberede tre prøveprodukter og indsætte dem i products
tabellen.
for at oprette PHP-koden skal du åbne en ny fil med din teksteditor:
- sudo nano /var/www/html/config.php
indtast derefter følgende oplysninger i filen og erstat PASSWORD
med den test_user
adgangskode, du oprettede i Trin 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);
Gem og luk filen.
i denne fil har du brugt fire PHP-konstanter til at oprette forbindelse til databasen, som du oprettede i Trin 1:
-
DB_NAME
: denne konstant har navnet påtest_company
databasen. -
DB_USER
: denne variabel indeholdertest_user
brugernavnet. -
DB_PASSWORD
: denne konstant gemmer MysklPASSWORD
aftest_user
– kontoen. -
DB_HOST
: dette repræsenterer den server, hvor databasen er placeret. I dette tilfælde bruger dulocalhost
serveren.
følgende linje i din fil initierer et PHP – dataobjekt (Bob) og opretter forbindelse til databasen:
...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...
mod slutningen af filen har du angivet et par PDO-attributter:
-
ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
: Denne attribut instruerer BOB til at kaste en undtagelse, der kan logges til fejlsøgningsformål. -
ATTR_EMULATE_PREPARES, false
: denne indstilling øger sikkerheden ved at bede databasemotoren om at gøre forberedelsen i stedet for BOB.
du inkluderer filen /var/www/html/config.php
i to PHP-scripts, som du opretter næste til henholdsvis indsættelse og hentning af poster.
Opret først PHP-scriptet /var/www/html/insert_products.php
til indsættelse af poster i tabellen produkter:
- sudo nano /var/www/html/insert_products.php
tilføj derefter følgende oplysninger i /var/www/html/insert_products.php
filen:
<?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";
Gem og luk filen.
i filen har du inkluderet config.php
filen øverst. Dette er den første fil, du oprettede til at definere databasevariablerne og oprette forbindelse til databasen. Filen initierer også et Bob-objekt og gemmer det i en $pdo
variabel.
dernæst har du oprettet en række af produkternes data, der skal indsættes i databasen. Bortset fra product_name
og price
, som er udarbejdet som strenge og numeriske værdier, bruger scriptet PHP ‘ s indbyggede file_get_contents
funktion til at læse billeder fra en ekstern kilde og sende dem som strenge til kolonnen product_image
.
dernæst har du udarbejdet en erklæring og brugt sætningen PHP foreach{...}
til at indsætte hvert produkt i databasen.
for at udføre /var/www/html/insert_products.php
– filen skal du køre den i dit bro.ser-vindue ved hjælp af følgende URL. Husk at erstatte your-server-IP
med den offentlige IP-adresse på din server:
http://your-server-IP/insert_products.php
når du har udført filen, vil du se en succesmeddelelse i din bro.ser, der bekræfter, at poster blev indsat i databasen.
du har indsat tre poster, der indeholder produktbilleder, i tabellen products
. I det næste trin opretter du et PHP-script til at hente disse poster og vise dem i din bro.ser.
Trin 3 — Visning af produktoplysninger fra databasen
med produktoplysninger og billeder i databasen skal du nu kode et andet PHP-script, der forespørger og viser produktoplysningerne i en HTML-tabel på din bro.ser.
for at oprette filen skal du skrive følgende:
- sudo nano /var/www/html/display_products.php
indtast derefter følgende oplysninger 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>
gem ændringerne i filen og luk den.
her har du igen inkluderet config.php
filen for at oprette forbindelse til databasen. Derefter har du forberedt og udført en erklæring med BOB for at hente alle elementer fra tabellen products
ved hjælp af kommandoen SELECT * FROM products
.
dernæst har du oprettet en HTML-tabel og udfyldt den med produkternes data ved hjælp af PHP while() {...}
– erklæringen. Linjen $row = $stmt->fetch(PDO::FETCH_ASSOC)
forespørger databasen og gemmer resultatet i variablen $row
som et multidimensionelt array, som du derefter har vist i en HTML-tabelkolonne ved hjælp af syntaksen $row
.
billederne fra kolonnen product_image
er lukket inde i <img src = "">
tags. Du har brugt attributterne width
og height
til at ændre størrelsen på billederne til en mindre størrelse, der kan passe i kolonnen HTML-tabel.
for at konvertere dataene fra datatypen BLOB
tilbage til billeder har du brugt den indbyggede PHP base64_encode
– funktion og følgende syntaks for Data URI-skemaet:
data:media_type;base64, base_64_encoded_data
i dette tilfælde er image/png
media_type
og Base64
kodet streng fra kolonnen product_image
er base_64_encoded_data
.
udfør derefter display_products.php
– filen i en internetsøgemaskine ved at skrive følgende adresse:
http://your-server-IP/display_products.php
når du har kørt display_products.php
– filen i din bro.ser, vil du se en HTML-tabel med en liste over produkter og tilknyttede billeder.
dette bekræfter, at PHP-scriptet til hentning af billeder fra databasen fungerer som forventet.
konklusion
i denne vejledning brugte du datatypen Myskl BLOB
til at gemme og vise billeder med PHP på Ubuntu 18.04. Du har også set de grundlæggende fordele ved at gemme billeder i en database i modsætning til at gemme dem i et filsystem. Disse omfatter portabilitet, sikkerhed og nem backup. Hvis du bygger en applikation som en studerendes portal eller medarbejderdatabase, der kræver, at information og relaterede billeder gemmes sammen, kan denne teknologi være til stor nytte for dig.
du kan finde flere oplysninger om de understøttede datatyper i
- Sådan implementeres paginering i PHP på Ubuntu 18.04
- Sådan bruges PDO PHP-udvidelsen til at udføre Myskl-transaktioner i PHP på Ubuntu 18.04