Der Autor hat Mädchen ausgewählt, die im Rahmen des Write for DOnations-Programms eine Spende erhalten möchten.
Einleitung
Ein Binary Large Object (BLOB
) ist ein MySQL-Datentyp, der Binärdaten wie Bilder, Multimedia- und PDF-Dateien speichern kann.
Wenn Sie Anwendungen erstellen, die eine eng gekoppelte Datenbank erfordern, in der Bilder mit verwandten Daten synchronisiert werden sollen (z. B. ein Mitarbeiterportal, eine Studentendatenbank oder eine Finanzanwendung), ist es möglicherweise praktisch, Bilder wie Passfotos und Unterschriften von Studenten neben anderen verwandten Informationen in einer MySQL-Datenbank zu speichern.
Hier kommt der MySQL BLOB
Datentyp ins Spiel. Dieser Programmieransatz macht das Erstellen eines separaten Dateisystems zum Speichern von Bildern überflüssig. Das Schema zentralisiert auch die Datenbank und macht sie portabler und sicherer, da die Daten vom Dateisystem isoliert sind. Das Erstellen von Backups ist auch nahtloser, da Sie eine einzelne MySQL-Dump-Datei erstellen können, die alle Ihre Daten enthält.
Das Abrufen von Daten ist schneller, und beim Erstellen von Datensätzen können Sie sicher sein, dass die Datenvalidierungsregeln und die referenzielle Integrität beibehalten werden, insbesondere wenn MySQL-Transaktionen verwendet werden.
In diesem Tutorial verwenden Sie den Datentyp MySQL BLOB
, um Bilder mit PHP unter Ubuntu 18.04 zu speichern.
Voraussetzungen
Um dieser Anleitung zu folgen, benötigen Sie Folgendes:
- Ein Ubuntu 18.04-Server, der mit dem anfänglichen Server-Setup mit Ubuntu 18.04 und einem Nicht-Root-Benutzer mit
sudo
-Berechtigungen konfiguriert wurde. - Apache, MySQL und PHP Richten Sie sich ein, indem Sie der Anleitung zur Installation von Linux, Apache, MySQL, PHP (LAMP) Stack unter Ubuntu 18.04 folgen. Für dieses Lernprogramm ist es nicht erforderlich, virtuelle Hosts zu erstellen, sodass Sie Schritt 4 überspringen können.
Schritt 1 – Erstellen einer Datenbank
Sie beginnen mit der Erstellung einer Beispieldatenbank für Ihr Projekt. Melden Sie sich dazu über SSH bei Ihrem Server an und führen Sie dann den folgenden Befehl aus, um sich als root bei Ihrem MySQL-Server anzumelden:
- sudo mysql -u root -p
Geben Sie das Root-Passwort Ihrer MySQL-Datenbank ein und drücken Sie ENTER
, um fortzufahren.
Führen Sie dann den folgenden Befehl aus, um eine Datenbank zu erstellen. In diesem Tutorial nennen wir es test_company
:
- CREATE DATABASE test_company;
Sobald die Datenbank erstellt wurde, sehen Sie die folgende Ausgabe:
OutputQuery OK, 1 row affected (0.01 sec)
Erstellen Sie als Nächstes ein test_user
-Konto auf dem MySQL-Server und denken Sie daran, PASSWORD
durch ein sicheres Kennwort zu ersetzen:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
Sie sehen die folgende Ausgabe:
OutputQuery OK, 0 rows affected (0.01 sec)
Um test_user
vollständige Berechtigungen für die test_company
-Datenbank zu erteilen, führen Sie Folgendes aus:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
Stellen Sie sicher, dass Sie die folgende Ausgabe erhalten:
OutputQuery OK, 0 rows affected (0.01 sec)
Leeren Sie abschließend die Privilegientabelle, damit MySQL die Berechtigungen neu laden kann:
- FLUSH PRIVILEGES;
Stellen Sie sicher, dass Sie die folgende Ausgabe sehen:
OutputQuery OK, 0 rows affected (0.01 sec)
Nachdem die test_company
-Datenbank und test_user
fertig sind, erstellen Sie eine products
-Tabelle zum Speichern von Beispielprodukten. Sie werden diese Tabelle später verwenden, um Datensätze einzufügen und abzurufen, um zu demonstrieren, wie MySQL BLOB
funktioniert.
Vom MySQL-Server abmelden:
- QUIT;
Melden Sie sich dann erneut mit den Anmeldeinformationen der test_user
an, die Sie erstellt haben:
- mysql -u test_user -p
Wenn Sie dazu aufgefordert werden, geben Sie das Passwort für test_user
ein und drücken Sie ENTER
, um fortzufahren. Wechseln Sie als Nächstes zur test_company
-Datenbank, indem Sie Folgendes eingeben:
- USE test_company;
Sobald die Datenbank test_company
ausgewählt ist, wird MySQL angezeigt:
OutputDatabase changed
Erstellen Sie als Nächstes eine products
-Tabelle, indem Sie Folgendes ausführen:
- CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;
Dieser Befehl erstellt eine Tabelle mit dem Namen products
. Die Tabelle hat vier Spalten:
-
product_id
: Diese Spalte verwendet einen DatentypBIGINT
, um eine große Liste von Produkten bis zu einem Maximum von 2⁶3-1 Elementen aufzunehmen. Sie haben die Spalte alsPRIMARY KEY
markiert, um Produkte eindeutig zu identifizieren. Damit MySQL die Generierung neuer Bezeichner für eingefügte Spalten verarbeiten kann, haben Sie das SchlüsselwortAUTO_INCREMENT
verwendet. -
product_name
: Diese Spalte enthält die Namen der Produkte. Sie haben den DatentypVARCHAR
verwendet, da dieses Feld im Allgemeinen alphanumerische Zeichen bis zu einem Maximum von50
Zeichen verarbeitet — das Limit von50
ist nur ein hypothetischer Wert, der für die Zwecke dieses Lernprogramms verwendet wird. -
price
: Zu Demonstrationszwecken enthält Ihre Tabelleproducts
die Spalteprice
zum Speichern des Verkaufspreises von Produkten. Da einige Produkte Gleitkommawerte haben können (z. B. 23,69, 45,36, 102,99), haben Sie den DatentypDOUBLE
verwendet. -
product_image
: Diese Spalte verwendet einen DatentypBLOB
, um die tatsächlichen Binärdaten der Produktbilder zu speichern.
Sie haben den InnoDB
-Speicher ENGINE
für die Tabelle verwendet, um eine breite Palette von Funktionen zu unterstützen, einschließlich MySQL-Transaktionen. Nachdem Sie dies zum Erstellen der Tabelle products
ausgeführt haben, wird die folgende Ausgabe angezeigt:
OutputQuery OK, 0 rows affected (0.03 sec)
Melden Sie sich von Ihrem MySQL-Server ab:
- QUIT;
Sie erhalten die folgende Ausgabe
OutputBye
Die products
-Tabelle ist jetzt bereit, einige Datensätze einschließlich der Produktbilder zu speichern, und Sie werden sie im nächsten Schritt mit einigen Produkten füllen.
Schritt 2 – Erstellen von PHP-Skripten zum Verbinden und Auffüllen der Datenbank
In diesem Schritt erstellen Sie ein PHP-Skript, das eine Verbindung zur MySQL-Datenbank herstellt, die Sie in Schritt 1 erstellt haben. Das Skript bereitet drei Beispielprodukte vor und fügt sie in die Tabelle products
ein.
Um den PHP-Code zu erstellen, öffnen Sie eine neue Datei mit Ihrem Texteditor:
- sudo nano /var/www/html/config.php
Geben Sie dann die folgenden Informationen in die Datei ein und ersetzen Sie PASSWORD
durch das test_user
-Kennwort, das Sie in Schritt 1 erstellt haben:
<?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);
Speichern und schließen Sie die Datei.
In dieser Datei haben Sie vier PHP-Konstanten verwendet, um eine Verbindung zur MySQL-Datenbank herzustellen, die Sie in Schritt 1:
-
DB_NAME
: Diese Konstante enthält den Namen dertest_company
-Datenbank. -
DB_USER
: Diese Variable enthält den Benutzernamentest_user
. -
DB_PASSWORD
: Diese Konstante speichert die MySQLPASSWORD
destest_user
-Kontos. -
DB_HOST
: Dies stellt den Server dar, auf dem sich die Datenbank befindet. In diesem Fall verwenden Sie den Serverlocalhost
.
Die folgende Zeile in Ihrer Datei initiiert ein PHP-Datenobjekt (PDO) und stellt eine Verbindung zur MySQL-Datenbank her:
...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...
Gegen Ende der Datei haben Sie einige PDO-Attribute festgelegt:
-
ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
: Dieses Attribut weist PDO an, eine Ausnahme auszulösen, die zu Debugzwecken protokolliert werden kann. -
ATTR_EMULATE_PREPARES, false
: Diese Option erhöht die Sicherheit, indem die MySQL-Datenbank-Engine angewiesen wird, die Vorbereitung anstelle von PDO durchzuführen.
Sie fügen die /var/www/html/config.php
-Datei in zwei PHP-Skripte ein, die Sie als nächstes zum Einfügen bzw.
Erstellen Sie zunächst das PHP-Skript /var/www/html/insert_products.php
zum Einfügen von Datensätzen in die Tabelle products:
- sudo nano /var/www/html/insert_products.php
Fügen Sie dann die folgenden Informationen in die Datei /var/www/html/insert_products.php
ein:
<?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";
Speichern und schließen Sie die Datei.
In der Datei haben Sie die config.php
-Datei oben eingefügt. Dies ist die erste Datei, die Sie zum Definieren der Datenbankvariablen und zum Herstellen einer Verbindung mit der Datenbank erstellt haben. Die Datei initiiert auch ein PDO-Objekt und speichert es in einer Variablen $pdo
.
Als Nächstes haben Sie ein Array der Produktdaten erstellt, die in die Datenbank eingefügt werden sollen. Abgesehen von product_name
und price
, die als Zeichenfolgen bzw. numerische Werte vorbereitet sind, verwendet das Skript die in PHP integrierte Funktion file_get_contents
, um Bilder aus einer externen Quelle zu lesen und sie als Zeichenfolgen an die Spalte product_image
zu übergeben.
Als nächstes haben Sie eine SQL-Anweisung vorbereitet und die PHP-Anweisung foreach{...}
verwendet, um jedes Produkt in die Datenbank einzufügen.
Um die /var/www/html/insert_products.php
-Datei auszuführen, führen Sie sie in Ihrem Browserfenster unter der folgenden URL aus. Denken Sie daran, your-server-IP
durch die öffentliche IP-Adresse Ihres Servers zu ersetzen:
http://your-server-IP/insert_products.php
Nach dem Ausführen der Datei wird in Ihrem Browser eine Erfolgsmeldung angezeigt, die bestätigt, dass Datensätze in die Datenbank eingefügt wurden.
Sie haben erfolgreich drei Datensätze mit Produktbildern in die Tabelle products
eingefügt. Im nächsten Schritt erstellen Sie ein PHP-Skript, um diese Datensätze abzurufen und in Ihrem Browser anzuzeigen.
Schritt 3 – Anzeigen von Produktinformationen aus der MySQL-Datenbank
Mit den Produktinformationen und Bildern in der Datenbank codieren Sie jetzt ein anderes PHP-Skript, das die Produktinformationen in einer HTML-Tabelle in Ihrem Browser abfragt und anzeigt.
Um die Datei zu erstellen, geben Sie Folgendes ein:
- sudo nano /var/www/html/display_products.php
Geben Sie dann die folgenden Informationen in die Datei ein:
<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>
Speichern Sie die Änderungen in der Datei und schließen Sie sie.
Hier haben Sie erneut die config.php
-Datei eingefügt, um eine Verbindung zur Datenbank herzustellen. Anschließend haben Sie eine SQL-Anweisung mit PDO vorbereitet und ausgeführt, um alle Elemente aus der Tabelle products
mit dem Befehl SELECT * FROM products
abzurufen.
Als nächstes haben Sie eine HTML-Tabelle erstellt und diese mit der PHP-Anweisung while() {...}
mit den Produktdaten gefüllt. Die Zeile $row = $stmt->fetch(PDO::FETCH_ASSOC)
fragt die Datenbank ab und speichert das Ergebnis in der Variablen $row
als mehrdimensionales Array, das Sie dann in einer HTML-Tabellenspalte mit der Syntax $row
angezeigt haben.
Die Bilder aus der Spalte product_image
sind in den Tags <img src = "">
eingeschlossen. Sie haben die Attribute width
und height
verwendet, um die Größe der Bilder auf eine kleinere Größe zu ändern, die in die HTML-Tabellenspalte passt.
Um die Daten des Datentyps BLOB
wieder in Bilder umzuwandeln, haben Sie die integrierte PHP-Funktion base64_encode
und die folgende Syntax für das Daten-URI-Schema verwendet:
data:media_type;base64, base_64_encoded_data
In diesem Fall ist die image/png
die media_type
und die Base64
codierte Zeichenfolge aus der product_image
Spalte ist die base_64_encoded_data
.
Führen Sie als Nächstes die display_products.php
-Datei in einem Webbrowser aus, indem Sie die folgende Adresse eingeben:
http://your-server-IP/display_products.php
Nachdem Sie die Datei display_products.php
in Ihrem Browser ausgeführt haben, sehen Sie eine HTML-Tabelle mit einer Liste von Produkten und zugehörigen Bildern.
Dies bestätigt, dass das PHP-Skript zum Abrufen von Bildern aus MySQL wie erwartet funktioniert.
Fazit
In diesem Handbuch haben Sie den Datentyp MySQL BLOB
zum Speichern und Anzeigen von Bildern mit PHP unter Ubuntu 18.04 verwendet. Sie haben auch die grundlegenden Vorteile des Speicherns von Bildern in einer Datenbank im Gegensatz zum Speichern in einem Dateisystem gesehen. Dazu gehören Portabilität, Sicherheit und einfache Sicherung. Wenn Sie eine Anwendung wie ein Studentenportal oder eine Mitarbeiterdatenbank erstellen, bei der Informationen und zugehörige Bilder zusammen gespeichert werden müssen, kann diese Technologie für Sie von großem Nutzen sein.
Weitere Informationen zu den unterstützten Datentypen in MySQL finden Sie im MySQL-Handbuch zu Datentypen. Wenn Sie an weiteren Inhalten zu MySQL und PHP interessiert sind, lesen Sie die folgenden Tutorials:
- Implementieren der Paginierung in MySQL mit PHP unter Ubuntu 18.04
- Verwenden der PDO PHP-Erweiterung zum Ausführen von MySQL-Transaktionen in PHP unter Ubuntu 18.04