autorul a selectat fetele care codifică pentru a primi o donație ca parte a programului Write for DOnations.
Introducere
un obiect binar mare (BLOB
) este un tip de date MySQL care poate stoca date binare, cum ar fi imagini, multimedia și fișiere PDF.
când creați aplicații care necesită o bază de date strâns cuplată în care imaginile ar trebui să fie sincronizate cu datele conexe (de exemplu, un portal pentru angajați, o bază de date pentru studenți sau o aplicație financiară), s-ar putea să vă fie convenabil să stocați imagini, cum ar fi fotografiile și semnăturile pașaportului studenților într-o bază de date MySQL, alături de alte informații conexe.
aici intervine Tipul de date MySQL BLOB
. Această abordare de programare elimină necesitatea creării unui sistem de fișiere separat pentru stocarea imaginilor. Schema centralizează, de asemenea, baza de date, făcând-o mai portabilă și mai sigură, deoarece datele sunt izolate de sistemul de fișiere. Crearea copiilor de rezervă este, de asemenea, mai perfectă, deoarece puteți crea un singur fișier mysql dump care conține toate datele dvs.
preluarea datelor este mai rapidă, iar la crearea înregistrărilor puteți fi sigur că regulile de validare a datelor și integritatea referențială sunt menținute în special atunci când se utilizează tranzacții MySQL.
în acest tutorial, veți utiliza tipul de date MySQL BLOB
pentru a stoca imagini cu PHP pe Ubuntu 18.04.
cerințe preliminare
pentru a urma împreună cu acest ghid, veți avea nevoie de următoarele:
- un server Ubuntu 18.04 configurat folosind configurarea inițială a serverului cu Ubuntu 18.04 și un utilizator non-root cu privilegii
sudo
. - Apache, MySQL și PHP configurați urmând ghidul despre cum să instalați stiva Linux, Apache, MySQL, PHP (LAMP) pe Ubuntu 18.04. Pentru acest tutorial, nu este necesar să creați gazde virtuale, astfel încât să puteți sări peste pasul 4.
Step 1 — Crearea unei baze de date
veți începe prin crearea unei baze de date eșantion pentru proiectul dumneavoastră. Pentru a face acest lucru, SSH în serverul dvs. și apoi executați următoarea comandă pentru a vă conecta la serverul MySQL ca root:
- sudo mysql -u root -p
introduceți parola de root a bazei de date MySQL și apăsați ENTER
pentru a continua.
apoi, executați următoarea comandă pentru a crea o bază de date. În acest tutorial îl vom numi test_company
:
- CREATE DATABASE test_company;
odată ce baza de date este creată, veți vedea următoarea ieșire:
OutputQuery OK, 1 row affected (0.01 sec)
apoi, creați un cont test_user
pe serverul MySQL și nu uitați să înlocuiți PASSWORD
cu o parolă puternică:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
veți vedea următoarea ieșire:
OutputQuery OK, 0 rows affected (0.01 sec)
pentru a acorda test_user
privilegii complete în baza de date test_company
, executați:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
asigurați-vă că obțineți următoarea ieșire:
OutputQuery OK, 0 rows affected (0.01 sec)
în cele din urmă, spălați tabelul de privilegii pentru ca MySQL să reîncarce permisiunile:
- FLUSH PRIVILEGES;
asigurați-vă că vedeți următoarea ieșire:
OutputQuery OK, 0 rows affected (0.01 sec)
acum că baza de date test_company
și test_user
sunt gata, veți trece la crearea unui tabel products
pentru stocarea produselor eșantion. Veți utiliza acest tabel mai târziu pentru a insera și a prelua înregistrări pentru a demonstra cum funcționează MySQL BLOB
.
Deconectați-vă de la serverul MySQL:
- QUIT;
apoi, conectați-vă din nou cu acreditările test_user
pe care le-ați creat:
- mysql -u test_user -p
când vi se solicită, introduceți parola pentru test_user
și apăsați ENTER
pentru a continua. Apoi, comutați la baza de date test_company
tastând următoarele:
- USE test_company;
odată ce baza de date test_company
este selectată, MySQL va afișa:
OutputDatabase changed
apoi, creați un tabel products
rulând:
- CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;
această comandă creează un tabel numit products
. Tabelul are patru coloane:
-
product_id
: Această coloană utilizează un tip de dateBIGINT
pentru a găzdui o listă mare de produse până la maximum 2 articole din 3-1. Ați marcat coloana caPRIMARY KEY
pentru a identifica în mod unic produsele. Pentru ca MySQL să gestioneze generarea de noi identificatori pentru coloanele inserate, ați utilizat cuvântul cheieAUTO_INCREMENT
. -
product_name
: această coloană conține numele produselor. Ați folosit tipul de dateVARCHAR
deoarece acest câmp va gestiona în general alfanumerice până la maximum50
caractere—limita50
este doar o valoare ipotetică utilizată în scopul acestui tutorial. -
price
: în scopuri demonstrative, tabelulproducts
conține coloanaprice
pentru a stoca prețul de vânzare cu amănuntul al produselor. Deoarece unele produse pot avea valori plutitoare (de exemplu, 23.69, 45.36, 102.99), ați utilizat tipul de dateDOUBLE
. -
product_image
: această coloană utilizează un tip de dateBLOB
pentru a stoca datele binare reale ale imaginilor produselor.
ați folosit spațiul de stocare InnoDB
ENGINE
pentru tabel pentru a suporta o gamă largă de caracteristici, inclusiv tranzacțiile MySQL. După executarea acestui lucru pentru crearea tabelului products
, veți vedea următoarea ieșire:
OutputQuery OK, 0 rows affected (0.03 sec)
Deconectați-vă de la serverul MySQL:
- QUIT;
veți obține următoarea ieșire
OutputBye
tabelul products
este acum gata să stocheze unele înregistrări, inclusiv imaginile produselor și îl veți popula cu unele produse în pasul următor.
Step 2 — crearea scripturilor PHP pentru conectarea și popularea bazei de date
în acest pas, veți crea un script PHP care se va conecta la baza de date MySQL pe care ați creat-o la Pasul 1. Scriptul va pregăti trei produse de probă și le va introduce în tabelul products
.
pentru a crea codul PHP, deschideți un fișier nou cu editorul de text:
- sudo nano /var/www/html/config.php
apoi, introduceți următoarele informații în fișier și înlocuiți PASSWORD
cu parola test_user
pe care ați creat-o la Pasul 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);
Salvați și închideți fișierul.
în acest fișier, ați folosit patru constante PHP pentru a vă conecta la baza de date MySQL pe care ați creat-o în Pas 1:
-
DB_NAME
: această constantă deține numele bazei de datetest_company
. -
DB_USER
: această variabilă deține numele de utilizatortest_user
. -
DB_PASSWORD
: această constantă stochează MySQLPASSWORD
din contultest_user
. -
DB_HOST
: acesta reprezintă serverul în care se află baza de date. În acest caz, utilizați serverullocalhost
.
următoarea linie din fișierul dvs. inițiază un obiect de date PHP (dop) și se conectează la baza de date MySQL:
...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...
spre sfârșitul fișierului, ați setat câteva atribute dop:
-
ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
: Acest atribut instruiește dop să arunce o excepție care poate fi înregistrată în scopuri de depanare. -
ATTR_EMULATE_PREPARES, false
: această opțiune crește securitatea spunând motorului bazei de date MySQL să pregătească în loc de dop.
veți include fișierul /var/www/html/config.php
în două scripturi PHP pe care le veți crea în continuare pentru inserarea și, respectiv, recuperarea înregistrărilor.
mai întâi, creați scriptul PHP /var/www/html/insert_products.php
pentru inserarea înregistrărilor în tabelul produse:
- sudo nano /var/www/html/insert_products.php
apoi, adăugați următoarele informații în fișierul /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";
Salvați și închideți fișierul.
în fișier, ați inclus fișierul config.php
în partea de sus. Acesta este primul fișier creat pentru definirea variabilelor bazei de date și conectarea la baza de date. Fișierul inițiază, de asemenea, un obiect dop și îl stochează într-o variabilă $pdo
.
apoi, ați creat o serie de date ale produselor pentru a fi inserate în baza de date. În afară de product_name
și price
, care sunt pregătite ca șiruri și respectiv valori numerice, scriptul folosește funcția file_get_contents
încorporată PHP pentru a citi imagini dintr-o sursă externă și a le transmite ca șiruri la coloana product_image
.
apoi, ați pregătit o instrucțiune SQL și ați folosit instrucțiunea PHP foreach{...}
pentru a insera fiecare produs în baza de date.
pentru a executa fișierul /var/www/html/insert_products.php
, rulați-l în fereastra browserului utilizând următoarea adresă URL. Nu uitați să înlocuiți your-server-IP
cu adresa IP publică a serverului dvs:
http://your-server-IP/insert_products.php
după executarea fișierului, veți vedea un mesaj de succes în browser care confirmă că înregistrările au fost inserate în baza de date.
ați introdus cu succes trei înregistrări care conțin imagini de produs în tabelul products
. În pasul următor, veți crea un script PHP pentru preluarea acestor înregistrări și afișarea lor în browser.
Pasul 3 — afișarea informațiilor produselor din Baza de date MySQL
cu informațiile și imaginile produselor din Baza de date, acum veți codifica un alt script PHP care interoghează și afișează informațiile produselor într-un tabel HTML din browserul dvs.
pentru a crea fișierul, tastați următoarele:
- sudo nano /var/www/html/display_products.php
apoi, introduceți următoarele informații în fișier:
<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>
Salvați modificările în fișier și închideți-l.
aici ați inclus din nou fișierul config.php
pentru a vă conecta la baza de date. Apoi, ați pregătit și executat o instrucțiune SQL folosind Dop pentru a prelua toate elementele din tabelul products
folosind comanda SELECT * FROM products
.
apoi, ați creat un tabel HTML și l-ați populat cu datele produselor utilizând instrucțiunea PHP while() {...}
. Linia $row = $stmt->fetch(PDO::FETCH_ASSOC)
interoghează baza de date și stochează rezultatul în variabila $row
ca o matrice multidimensională, pe care ați afișat-o apoi într-o coloană de tabel HTML utilizând sintaxa $row
.
imaginile din coloana product_image
sunt închise în interiorul etichetelor <img src = "">
. Ați utilizat atributele width
și height
pentru a redimensiona imaginile la o dimensiune mai mică care se poate încadra în coloana tabel HTML.
pentru a converti datele deținute de tipul de date BLOB
înapoi la imagini, ați utilizat funcția PHP base64_encode
încorporată și următoarea sintaxă pentru schema URI de date:
data:media_type;base64, base_64_encoded_data
în acest caz, image/png
este media_type
și șirul codificat Base64
din coloana product_image
este base_64_encoded_data
.
apoi, executați fișierul display_products.php
într-un browser web tastând următoarea adresă:
http://your-server-IP/display_products.php
după rularea fișierului display_products.php
în browserul dvs., veți vedea un tabel HTML cu o listă de produse și imagini asociate.
aceasta confirmă faptul că scriptul PHP pentru Preluarea imaginilor din MySQL funcționează conform așteptărilor.
concluzie
în acest ghid, ați utilizat Tipul de date MySQL BLOB
pentru a stoca și afișa imagini cu PHP pe Ubuntu 18.04. De asemenea, ați văzut avantajele de bază ale stocării imaginilor într-o bază de date, spre deosebire de stocarea lor într-un sistem de fișiere. Acestea includ portabilitatea, securitatea și ușurința de backup. Dacă construiți o aplicație, cum ar fi un portal al studenților sau o bază de date a angajaților, care necesită stocarea împreună a informațiilor și a imaginilor conexe, atunci această tehnologie vă poate fi de mare folos.
pentru mai multe informații despre tipurile de date acceptate în MySQL urmați ghidul tipurilor de date MySQL. Dacă sunteți interesat de conținut suplimentar legat de MySQL și PHP, consultați următoarele tutoriale:
- cum să implementați paginarea în MySQL cu PHP pe Ubuntu 18.04
- cum să utilizați extensia PHP Dop pentru a efectua tranzacții MySQL în PHP pe Ubuntu 18.04