jak używać Typu danych Blob MySQL do przechowywania obrazów z PHP na Ubuntu 18.04

autor wybrał Girls Who Code, aby otrzymać darowiznę w ramach programu napisz do darowizn.

wprowadzenie

binarny duży obiekt (BLOB) to typ danych MySQL, który może przechowywać dane binarne, takie jak obrazy, multimedia i pliki PDF.

podczas tworzenia aplikacji, które wymagają ściśle powiązanej bazy danych, w której obrazy powinny być zsynchronizowane z powiązanymi danymi (na przykład portal pracowników, Baza Danych studentów lub aplikacja finansowa), wygodne może być przechowywanie obrazów, takich jak zdjęcia paszportowe studentów i podpisy w bazie danych MySQL wraz z innymi powiązanymi informacjami.

tutaj pojawia się Typ danych MySQL BLOB. Takie podejście do programowania eliminuje potrzebę tworzenia oddzielnego systemu plików do przechowywania obrazów. Program centralizuje również bazę danych, czyniąc ją bardziej przenośną i bezpieczną, ponieważ dane są izolowane od systemu plików. Tworzenie kopii zapasowych jest również bardziej płynne, ponieważ można utworzyć pojedynczy plik zrzutu MySQL, który zawiera wszystkie dane.

pobieranie danych jest szybsze, a podczas tworzenia rekordów możesz mieć pewność, że reguły walidacji danych i integralność odniesienia są zachowane, zwłaszcza podczas korzystania z transakcji MySQL.

w tym samouczku użyjesz typu danych MySQL BLOB do przechowywania obrazów z PHP na Ubuntu 18.04.

aby postępować zgodnie z tym przewodnikiem, będziesz potrzebować następujących:

  • serwer Ubuntu 18.04 skonfigurowany przy użyciu Początkowej Konfiguracji serwera z Ubuntu 18.04 i użytkownikiem innym niż root z uprawnieniami sudo.
  • Apache, MySQL i PHP skonfiguruj, postępując zgodnie z przewodnikiem dotyczącym instalacji stosu Linux, Apache, MySQL, PHP (LAMP) na Ubuntu 18.04. W tym samouczku nie jest konieczne tworzenie wirtualnych hostów, więc możesz pominąć krok 4.

Krok 1 — Tworzenie bazy danych

rozpocznij od utworzenia przykładowej bazy danych dla Twojego projektu. Aby to zrobić, SSH wejdź na serwer, a następnie uruchom następujące polecenie, aby zalogować się na serwer MySQL jako root:

  • sudo mysql -u root -p

wprowadź hasło root bazy danych MySQL i naciśnij ENTER, aby kontynuować.

następnie uruchom następujące polecenie, aby utworzyć bazę danych. W tym tutorialu nazwiemy go test_company:

  • CREATE DATABASE test_company;

po utworzeniu bazy danych zobaczysz następujące wyjście:

Output
Query OK, 1 row affected (0.01 sec)

następnie utwórz konto test_user na serwerze MySQL i pamiętaj, aby zastąpić PASSWORD silnym hasłem:

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

zobaczysz następujące wyjście:

Output
Query OK, 0 rows affected (0.01 sec)

aby przyznać test_user pełne uprawnienia w bazie danych test_company, Uruchom:

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

upewnij się, że masz następujące wyjście:

Output
Query OK, 0 rows affected (0.01 sec)

na koniec opróżnij tabelę uprawnień, aby MySQL mógł ponownie załadować uprawnienia:

  • FLUSH PRIVILEGES;

upewnij się, że widzisz następujące wyjście:

Output
Query OK, 0 rows affected (0.01 sec)

teraz, gdy baza danych test_company i test_user są gotowe, przejdziesz do tworzenia tabeli products do przechowywania przykładowych produktów. Później użyjesz tej tabeli do wstawiania i pobierania rekordów, aby pokazać, jak działa MySQL BLOB.

Wyloguj się z serwera MySQL:

  • QUIT;

następnie zaloguj się ponownie za pomocą poświadczeń utworzonych przez test_user :

  • mysql -u test_user -p

po wyświetleniu monitu wprowadź hasło dla test_user i naciśnij ENTER, aby kontynuować. Następnie przełącz się do bazy test_company, wpisując następujący:

  • USE test_company;

Po wybraniu bazy test_company MySQL wyświetli:

Output
Database changed

następnie utwórz tabelę products, uruchamiając:

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

polecenie to tworzy tabelę o nazwie products. Tabela ma cztery kolumny:

  • product_id: Kolumna ta wykorzystuje typ danych BIGINT, aby pomieścić dużą listę produktów do maksymalnie 23-1 pozycji. Oznaczono kolumnę jako PRIMARY KEY, aby jednoznacznie zidentyfikować produkty. Aby MySQL mógł obsługiwać generowanie nowych identyfikatorów dla wstawianych kolumn, użyłeś słowa kluczowego AUTO_INCREMENT.

  • product_name: w tej kolumnie znajdują się nazwy produktów. Użyłeś typu danych VARCHAR, ponieważ to pole zazwyczaj obsługuje znaki alfanumeryczne do maksymalnie 50 znaków—limit 50 jest tylko hipotetyczną wartością używaną do celów tego samouczka.

  • price: dla celów demonstracyjnych tabela products zawiera kolumnę price do przechowywania ceny detalicznej produktów. Ponieważ niektóre produkty mogą mieć zmienne wartości (na przykład 23.69, 45.36, 102.99), użyto typu danych DOUBLE.

  • product_image: ta kolumna używa typu danych BLOB do przechowywania rzeczywistych danych binarnych obrazów produktów.

używałeś pamięci InnoDB ENGINE dla tabeli, aby obsługiwać szeroki zakres funkcji, w tym transakcje MySQL. Po wykonaniu tej czynności w celu utworzenia tabeli products, zobaczysz następujące wyjście:

Output
Query OK, 0 rows affected (0.03 sec)

Wyloguj się z serwera MySQL:

  • QUIT;

otrzymasz następujący wynik

Output
Bye

tabela products jest teraz gotowa do przechowywania niektórych rekordów, w tym obrazów produktów, i zapełnisz ją niektórymi produktami w następnym kroku.

Krok 2 — tworzenie skryptów PHP do łączenia i wypełniania bazy danych

w tym kroku utworzysz skrypt PHP, który połączy się z bazą danych MySQL utworzoną w Kroku 1. Skrypt przygotuje trzy przykładowe produkty i wstawi je do tabeli products.

aby utworzyć kod PHP, Otwórz nowy plik za pomocą edytora tekstu:

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

następnie wprowadź następujące informacje do pliku i zastąp PASSWORD hasłem test_user utworzonym w 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);

Zapisz i zamknij plik.

w tym pliku użyto czterech stałych PHP, aby połączyć się z bazą danych MySQL utworzoną w Kroku 1:

  • DB_NAME : stała ta zawiera nazwę bazy test_company.

  • DB_USER : ta zmienna posiada nazwę użytkownika test_user.

  • DB_PASSWORD : ta stała przechowuje MySQL PASSWORD konta test_user.

  • DB_HOST: oznacza to serwer, na którym znajduje się baza danych. W tym przypadku korzystasz z serwera localhost.

poniższy wiersz w pliku inicjuje obiekt danych PHP (PDO) i łączy się z bazą danych MySQL:

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

pod koniec pliku ustawiono kilka atrybutów PDO:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: Ten atrybut instruuje PDO, aby rzucił wyjątek, który może być zarejestrowany w celu debugowania.
  • ATTR_EMULATE_PREPARES, false: ta opcja zwiększa bezpieczeństwo, nakazując silnikowi bazy danych MySQL przygotowanie zamiast PDO.

plik /var/www/html/config.php zostanie dołączony do dwóch skryptów PHP, które utworzysz następnie do wstawiania i pobierania rekordów odpowiednio.

najpierw Utwórz skrypt PHP /var/www/html/insert_products.php do wstawiania rekordów do tabeli produktów:

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

następnie do pliku /var/www/html/insert_products.php dodaj następujące informacje:

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

Zapisz i zamknij plik.

w pliku umieściłeś plik config.php na górze. Jest to pierwszy plik utworzony do definiowania zmiennych bazy danych i łączenia się z bazą danych. Plik inicjuje również obiekt PDO i przechowuje go w zmiennej $pdo.

następnie utworzyłeś tablicę danych produktów, które zostaną wstawione do bazy danych. Oprócz product_name i price, które są przygotowane odpowiednio jako ciągi znaków i wartości liczbowe, skrypt używa wbudowanej funkcji PHP file_get_contents do odczytu obrazów z zewnętrznego źródła i przekazania ich jako ciągi znaków do kolumny product_image.

następnie przygotowałeś instrukcję SQL i użyłeś instrukcji PHP foreach{...}, aby wstawić każdy produkt do bazy danych.

aby wykonać plik /var/www/html/insert_products.php, uruchom go w oknie przeglądarki, używając następującego adresu URL. Pamiętaj, aby zastąpić your-server-IP publicznym adresem IP Twojego serwera:

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

po wykonaniu pliku w przeglądarce pojawi się komunikat potwierdzający wstawianie rekordów do bazy danych.

komunikat o powodzeniu pokazujący, że rekordy zostały wstawione do bazy danych

pomyślnie wstawiono trzy rekordy zawierające obrazy produktów do tabeli products. W następnym kroku utworzysz skrypt PHP do pobierania tych rekordów i wyświetlania ich w przeglądarce.

Krok 3 — Wyświetlanie informacji o produktach z bazy danych MySQL

dzięki informacjom o produktach i obrazom w bazie danych kodujesz kolejny skrypt PHP, który wyszukuje i wyświetla informacje o produktach w tabeli HTML w przeglądarce.

aby utworzyć plik, wpisz następujący:

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

następnie wprowadź do pliku następujące informacje:

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

Zapisz zmiany w pliku i zamknij go.

tutaj ponownie włączyłeś plik config.php, aby połączyć się z bazą danych. Następnie przygotowałeś i wykonałeś polecenie SQL używając PDO, aby pobrać wszystkie elementy z tabeli products za pomocą polecenia SELECT * FROM products.

następnie utworzyłeś tabelę HTML i wypełniłeś ją danymi produktów za pomocą instrukcji PHP while() {...}. Linia $row = $stmt->fetch(PDO::FETCH_ASSOC) sprawdza bazę danych i przechowuje wynik w zmiennej $row jako wielowymiarową tablicę, którą następnie Wyświetlono w kolumnie tabeli HTML przy użyciu składni $row.

obrazy z kolumny product_image są zamknięte wewnątrz znaczników <img src = "">. Atrybuty width i height zostały użyte do zmiany rozmiaru obrazów na mniejszy, który może zmieścić się w kolumnie tabeli HTML.

aby przekonwertować dane przechowywane przez typ danych BLOB z powrotem na obrazy, użyłeś wbudowanej funkcji PHP base64_encode i następującej składni dla schematu URI danych:

data:media_type;base64, base_64_encoded_data

w tym przypadku image/png jest media_type i Base64 zakodowany łańcuch z kolumny product_image jest base_64_encoded_data.

następnie wykonaj plik display_products.php w przeglądarce internetowej, wpisując następujący adres:

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

po uruchomieniu pliku display_products.php w przeglądarce zobaczysz tabelę HTML z listą produktów i powiązanymi obrazami.

lista produktów z bazy danych MySQL

to potwierdza, że skrypt PHP do pobierania obrazów z MySQL działa zgodnie z oczekiwaniami.

wniosek

w tym przewodniku użyłeś typu danych MySQL BLOB do przechowywania i wyświetlania obrazów z PHP na Ubuntu 18.04. Zauważyłeś również podstawowe zalety przechowywania obrazów w bazie danych w przeciwieństwie do przechowywania ich w systemie plików. Obejmują one przenośność, Bezpieczeństwo i łatwość tworzenia kopii zapasowych. Jeśli tworzysz aplikację, taką jak portal studentów lub baza danych pracowników, która wymaga przechowywania informacji i powiązanych obrazów, ta technologia może być dla ciebie bardzo przydatna.

aby uzyskać więcej informacji na temat obsługiwanych typów danych w MySQL, zapoznaj się z przewodnikiem typy danych MySQL. Jeśli interesują Cię dalsze treści związane z MySQL i PHP, zapoznaj się z poniższymi samouczkami:

  • jak zaimplementować Paginację w MySQL z PHP na Ubuntu 18.04
  • jak używać rozszerzenia PDO PHP do wykonywania transakcji MySQL w PHP na Ubuntu 18.04

Leave a Reply

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.