Sådan bruges datatypen MYSKL BLOB til at gemme billeder med PHP på Ubuntu 18.04

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:

Output
Query 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:

Output
Query 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:

Output
Query 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:

Output
Query 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:

Output
Database 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 datatype BIGINT til at rumme en stor liste over produkter på op til maksimalt 2 oversættelse3-1-elementer. Du har markeret kolonnen som PRIMARY KEY for entydigt at identificere produkter. For at kunne håndtere genereringen af nye identifikatorer for indsatte kolonner, har du brugt søgeordet AUTO_INCREMENT.

  • product_name: denne kolonne indeholder navnene på produkterne. Du har brugt datatypen VARCHAR, da dette felt generelt håndterer alfanumerik op til maksimalt 50 tegn—grænsen på 50 er kun en hypotetisk værdi, der bruges til formålet med denne tutorial.

  • price: til demonstrationsformål indeholder tabellen products kolonnen price 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 datatypen DOUBLE.

  • product_image: denne kolonne bruger en BLOB 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:

Output
Query OK, 0 rows affected (0.03 sec)

Log ud fra din server:

  • QUIT;

du får følgende output

Output
Bye

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:

/var/h/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);

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 indeholder test_user brugernavnet.

  • DB_PASSWORD : denne konstant gemmer Myskl PASSWORD af test_user – kontoen.

  • DB_HOST: dette repræsenterer den server, hvor databasen er placeret. I dette tilfælde bruger du localhost 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:

/var/h/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";

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.

en succesmeddelelse, der viser, 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:

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

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.

liste over produkter fra databasen

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 ved at følge vejledningen til datatyper. Hvis du er interesseret i yderligere indhold relateret til Myscl og PHP, skal du tjekke følgende tutorials:

  • 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

Leave a Reply

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.