jak používat datový typ MySQL BLOB k ukládání obrázků s PHP na Ubuntu 18.04

autor vybral dívky, které kódují, aby obdržely dar jako součást programu Write for Dars.

Úvod

binární velký objekt (BLOB) je datový typ MySQL, který může ukládat binární data, jako jsou obrázky, multimédia a soubory PDF.

při vytváření aplikací, které vyžadují úzce propojenou databázi, kde by obrázky měly být synchronizovány se souvisejícími údaji (například portál zaměstnanců, Databáze studentů nebo finanční aplikace), může být vhodné ukládat obrázky, jako jsou pasové fotografie a podpisy studentů, do databáze MySQL spolu s dalšími souvisejícími informacemi.

Zde přichází datový typ MySQL BLOB. Tento programovací přístup eliminuje potřebu vytvoření samostatného systému souborů pro ukládání obrázků. Schéma také centralizuje databázi, díky čemuž je přenosnější a bezpečnější, protože data jsou izolována od systému souborů. Vytváření záloh je také bezproblémové, protože můžete vytvořit jeden soubor výpisu MySQL, který obsahuje všechna vaše data.

načítání dat je rychlejší a při vytváření záznamů si můžete být jisti, že pravidla ověřování dat a referenční integrita jsou zachována zejména při použití transakcí MySQL.

v tomto tutoriálu budete používat datový typ MySQL BLOB pro ukládání obrázků s PHP na Ubuntu 18.04.

předpoklady

Chcete-li postupovat podle této příručky, budete potřebovat následující:

  • server Ubuntu 18.04 nakonfigurovaný pomocí počátečního nastavení serveru s Ubuntu 18.04 a nekořenovým uživatelem s oprávněními sudo.
  • Apache, MySQL a PHP nastavit podle návodu, Jak nainstalovat Linux, Apache, MySQL, PHP (LAMP) stack na Ubuntu 18.04. Pro tento tutoriál není nutné vytvářet virtuální hostitele, takže můžete přeskočit krok 4.

Krok 1-Vytvoření databáze

začnete vytvořením vzorové databáze pro váš projekt. Chcete-li to provést, SSH na váš server a spusťte následující příkaz pro přihlášení k serveru MySQL jako root:

  • sudo mysql -u root -p

zadejte kořenové heslo vaší databáze MySQL a pokračujte stisknutím ENTER.

poté spusťte následující příkaz k vytvoření databáze. V tomto tutoriálu to pojmenujeme test_company:

  • CREATE DATABASE test_company;

po vytvoření databáze se zobrazí následující výstup:

Output
Query OK, 1 row affected (0.01 sec)

dále vytvořte účet test_user na serveru MySQL a nezapomeňte nahradit PASSWORD silným heslem:

  • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

zobrazí se následující výstup:

Output
Query OK, 0 rows affected (0.01 sec)

Chcete-li udělit test_user plná oprávnění v databázi test_company, spusťte:

  • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

ujistěte se, že máte následující výstup:

Output
Query OK, 0 rows affected (0.01 sec)

nakonec propláchněte tabulku oprávnění, aby MySQL znovu načetl oprávnění:

  • FLUSH PRIVILEGES;

ujistěte se, že vidíte následující výstup:

Output
Query OK, 0 rows affected (0.01 sec)

nyní, když jsou databáze test_company a test_user připraveny, přejdete k vytvoření tabulky products pro ukládání ukázkových produktů. Tuto tabulku později použijete k vložení a načtení záznamů, abyste ukázali, jak MySQL BLOB funguje.

odhlaste se ze serveru MySQL:

  • QUIT;

poté se znovu přihlaste pomocí přihlašovacích údajů test_user, které jste vytvořili:

  • mysql -u test_user -p

po zobrazení výzvy zadejte heslo pro test_user a pokračujte stisknutím ENTER. Dále přepněte do databáze test_company zadáním následujícího:

  • USE test_company;

jakmile je vybrána databáze test_company, zobrazí se MySQL:

Output
Database changed

dále vytvořte products tabulku spuštěním:

  • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

tento příkaz vytvoří tabulku s názvem products. Tabulka má čtyři sloupce:

  • product_id: Tento sloupec používá BIGINT datový typ, aby mohl obsahovat velký seznam produktů až do maxima 2⁶3-1 položek. Sloupec jste označili jako PRIMARY KEY, abyste jednoznačně identifikovali produkty. Aby MySQL zvládlo generování nových identifikátorů pro vložené sloupce, použili jste Klíčové slovo AUTO_INCREMENT.

  • product_name: tento sloupec obsahuje názvy produktů. Použili jste datový typ VARCHAR, protože toto pole bude obecně zpracovávat alfanumeriku až do maxima 50 znaků—limit 50 je pouze hypotetická hodnota použitá pro účely tohoto tutoriálu.

  • price: pro demonstrační účely obsahuje tabulka products sloupec price pro uložení maloobchodní ceny produktů. Protože některé produkty mohou mít plovoucí hodnoty (například 23.69, 45.36, 102.99), použili jste datový typ DOUBLE.

  • product_image: tento sloupec používá datový typ BLOB k ukládání skutečných binárních dat obrázků produktů.

pro tabulku jste použili úložiště InnoDB ENGINE k podpoře široké škály funkcí včetně transakcí MySQL. Po provedení tohoto pro vytvoření tabulky products se zobrazí následující výstup:

Output
Query OK, 0 rows affected (0.03 sec)

odhlaste se ze serveru MySQL:

  • QUIT;

získáte následující výstup

Output
Bye

tabulka products je nyní připravena k uložení některých záznamů včetně obrázků produktů a v dalším kroku ji naplníte některými produkty.

Krok 2-Vytvoření PHP skriptů pro připojení a vyplnění databáze

v tomto kroku vytvoříte PHP skript, který se připojí k databázi MySQL, kterou jste vytvořili v kroku 1. Skript připraví tři ukázkové produkty a vloží je do tabulky products.

Chcete-li vytvořit PHP kód, otevřete nový soubor pomocí textového editoru:

  • sudo nano /var/www/html/config.php

poté zadejte do souboru následující informace a nahraďte PASSWORD heslem test_user, které jste vytvořili v kroku 1:

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

Uložte a zavřete soubor.

v tomto souboru jste použili čtyři konstanty PHP pro připojení k databázi MySQL, kterou jste vytvořili v kroku 1:

  • DB_NAME : tato konstanta má název test_company databáze.

  • DB_USER : tato proměnná obsahuje test_user uživatelské jméno.

  • DB_PASSWORD : tato konstanta ukládá MySQL PASSWORD účtu test_user.

  • DB_HOST: to představuje server, na kterém je databáze umístěna. V tomto případě používáte server localhost.

následující řádek v souboru iniciuje PHP datový objekt (CHOP) a připojí se k databázi MySQL:

...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...

ke konci souboru jste nastavili několik atributů chop:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: Tento atribut přikazuje chop hodit výjimku, která může být zaznamenána pro účely ladění.
  • ATTR_EMULATE_PREPARES, false: tato možnost zvyšuje bezpečnost tím, že řekne databázovému stroji MySQL, aby se připravil místo chop.

soubor /var/www/html/config.php zahrnete do dvou PHP skriptů, které vytvoříte dále pro vkládání a načítání záznamů.

nejprve vytvořte /var/www/html/insert_products.php PHP skript pro vkládání záznamů do tabulky produktů:

  • sudo nano /var/www/html/insert_products.php

poté přidejte do souboru /var/www/html/insert_products.php následující informace:

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

Uložte a zavřete soubor.

v souboru jste zahrnuli soubor config.php nahoře. Toto je první soubor, který jste vytvořili pro definování databázových proměnných a připojení k databázi. Soubor také iniciuje objekt CHOP a uloží jej do proměnné $pdo.

dále jste vytvořili pole dat produktů, která mají být vložena do databáze. Kromě product_name a price, které jsou připraveny jako řetězce a číselné hodnoty, skript používá vestavěnou funkci file_get_contents PHP ke čtení obrázků z externího zdroje a jejich předání jako řetězce do sloupce product_image.

dále jste připravili příkaz SQL a pomocí příkazu PHP foreach{...} vložili každý produkt do databáze.

Chcete-li spustit soubor /var/www/html/insert_products.php, spusťte jej v okně prohlížeče pomocí následující adresy URL. Nezapomeňte nahradit your-server-IP veřejnou IP adresou vašeho serveru:

http://your-server-IP/insert_products.php

po spuštění souboru se v prohlížeči zobrazí zpráva o úspěchu potvrzující vložení záznamů do databáze.

zpráva o úspěchu, která ukazuje, že záznamy byly vloženy do databáze

do tabulky products jste úspěšně vložili tři záznamy obsahující obrázky produktů. V dalším kroku vytvoříte PHP skript pro načtení těchto záznamů a jejich zobrazení ve Vašem prohlížeči.

Krok 3-Zobrazení informací o produktech z databáze MySQL

s informacemi a obrázky produktů v databázi nyní kódujete další PHP skript, který dotazuje a zobrazuje informace o produktech v tabulce HTML ve Vašem prohlížeči.

Chcete-li soubor vytvořit, zadejte následující:

  • sudo nano /var/www/html/display_products.php

poté do souboru zadejte následující informace:

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

uložte změny do souboru a zavřete jej.

zde jste opět zahrnuli soubor config.php, abyste se mohli připojit k databázi. Poté jste připravili a provedli příkaz SQL pomocí chop pro načtení všech položek z tabulky products pomocí příkazu SELECT * FROM products.

dále jste vytvořili tabulku HTML a vyplnili ji daty produktů pomocí příkazu PHP while() {...}. Řádek $row = $stmt->fetch(PDO::FETCH_ASSOC) dotazuje databázi a uloží výsledek do proměnné $row jako vícerozměrné pole, které jste poté zobrazili ve sloupci tabulky HTML pomocí syntaxe $row.

obrázky ze sloupce product_image jsou uzavřeny uvnitř značek <img src = "">. Použili jste atributy width a height pro změnu velikosti obrázků na menší velikost, která se vejde do sloupce tabulky HTML.

Chcete-li převést data uložená datovým typem BLOB zpět na obrázky, použili jste vestavěnou funkci PHP base64_encode a následující syntaxi pro schéma Data URI:

data:media_type;base64, base_64_encoded_data

v tomto případě je image/png media_type a Base64 kódovaný řetězec ze sloupce product_image je base_64_encoded_data.

poté spusťte soubor display_products.php ve webovém prohlížeči zadáním následující adresy:

http://your-server-IP/display_products.php

po spuštění souboru display_products.php v prohlížeči se zobrazí tabulka HTML se seznamem produktů a přidružených obrázků.

 seznam produktů z databáze MySQL

to potvrzuje, že PHP skript pro načítání obrázků z MySQL pracuje podle očekávání.

závěr

v této příručce jste použili datový typ MySQL BLOB k ukládání a zobrazování obrázků pomocí PHP na Ubuntu 18.04. Viděli jste také základní výhody ukládání obrázků do databáze, na rozdíl od jejich ukládání do systému souborů. Patří mezi ně přenositelnost, bezpečnost a snadné zálohování. Pokud vytváříte aplikaci, jako je portál studentů nebo databáze zaměstnanců, která vyžaduje společné ukládání informací a souvisejících obrázků, může vám tato technologie velmi pomoci.

další informace o podporovaných datových typech v MySQL naleznete v příručce MySQL Data type guide. Máte-li zájem o další obsah týkající se MySQL a PHP, podívejte se na následující návody:

  • jak implementovat stránkování v MySQL s PHP na Ubuntu 18.04
  • jak používat rozšíření PDO PHP k provádění transakcí MySQL v PHP na Ubuntu 18.04

Leave a Reply

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.