Verwendung des MySQL-BLOB-Datentyps zum Speichern von Bildern mit PHP unter Ubuntu 18.04

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:

Output
Query 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:

Output
Query 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:

Output
Query 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:

Output
Query 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:

Output
Database 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 Datentyp BIGINT, um eine große Liste von Produkten bis zu einem Maximum von 2⁶3-1 Elementen aufzunehmen. Sie haben die Spalte als PRIMARY KEY markiert, um Produkte eindeutig zu identifizieren. Damit MySQL die Generierung neuer Bezeichner für eingefügte Spalten verarbeiten kann, haben Sie das Schlüsselwort AUTO_INCREMENT verwendet.

  • product_name: Diese Spalte enthält die Namen der Produkte. Sie haben den Datentyp VARCHAR verwendet, da dieses Feld im Allgemeinen alphanumerische Zeichen bis zu einem Maximum von 50 Zeichen verarbeitet — das Limit von 50 ist nur ein hypothetischer Wert, der für die Zwecke dieses Lernprogramms verwendet wird.

  • price: Zu Demonstrationszwecken enthält Ihre Tabelle products die Spalte price zum Speichern des Verkaufspreises von Produkten. Da einige Produkte Gleitkommawerte haben können (z. B. 23,69, 45,36, 102,99), haben Sie den Datentyp DOUBLE verwendet.

  • product_image: Diese Spalte verwendet einen Datentyp BLOB, 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:

Output
Query OK, 0 rows affected (0.03 sec)

Melden Sie sich von Ihrem MySQL-Server ab:

  • QUIT;

Sie erhalten die folgende Ausgabe

Output
Bye

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:

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

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 der test_company-Datenbank.

  • DB_USER : Diese Variable enthält den Benutzernamen test_user.

  • DB_PASSWORD : Diese Konstante speichert die MySQL PASSWORD des test_user -Kontos.

  • DB_HOST: Dies stellt den Server dar, auf dem sich die Datenbank befindet. In diesem Fall verwenden Sie den Server localhost.

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:

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

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.

Eine Erfolgsmeldung zeigt an, 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:

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

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.

Liste der Produkte aus der MySQL-Datenbank

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

Leave a Reply

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.