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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputDatabase 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 danychBIGINT
, aby pomieścić dużą listę produktów do maksymalnie 23-1 pozycji. Oznaczono kolumnę jakoPRIMARY KEY
, aby jednoznacznie zidentyfikować produkty. Aby MySQL mógł obsługiwać generowanie nowych identyfikatorów dla wstawianych kolumn, użyłeś słowa kluczowegoAUTO_INCREMENT
. -
product_name
: w tej kolumnie znajdują się nazwy produktów. Użyłeś typu danychVARCHAR
, ponieważ to pole zazwyczaj obsługuje znaki alfanumeryczne do maksymalnie50
znaków—limit50
jest tylko hipotetyczną wartością używaną do celów tego samouczka. -
price
: dla celów demonstracyjnych tabelaproducts
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 danychDOUBLE
. -
product_image
: ta kolumna używa typu danychBLOB
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:
OutputQuery OK, 0 rows affected (0.03 sec)
Wyloguj się z serwera MySQL:
- QUIT;
otrzymasz następujący wynik
OutputBye
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:
<?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ę bazytest_company
. -
DB_USER
: ta zmienna posiada nazwę użytkownikatest_user
. -
DB_PASSWORD
: ta stała przechowuje MySQLPASSWORD
kontatest_user
. -
DB_HOST
: oznacza to serwer, na którym znajduje się baza danych. W tym przypadku korzystasz z serweralocalhost
.
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:
<?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.
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:
<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.
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