Tutorial

Verwenden des MySQL BLOB-Datentyps zum Speichern von Bildern mit PHP unter Ubuntu 20.04

MySQLPHPUbuntu 18.04Databases

Der Autor hat Girls Who Code dazu ausgewählt, im Rahmen des Programms Write for DOnations eine Spende zu erhalten.

Einführung

Ein Binary Large Object (BLOB) ist ein MySQL-Datentyp, der Binärdaten wie Bild-, Multimedia- und PDF-Dateien speichern kann.

Bei der Erstellung von Anwendungen, die eine eng gekoppelte Datenbank erfordern, in der Bilder mit verwandten Daten synchronisiert sein sollen (z. B. ein Mitarbeiterportal, eine Studentendatenbank oder eine Finanzanwendung), finden Sie es ggf. praktisch, Bilder wie Passfotos und Unterschriften von Studenten in einer MySQL-Datenbank neben anderen Informationen zu speichern.

Hier kommt der Datentyp MySQL BLOB ins Spiel. Dieser Programmieransatz beseitigt die Notwendigkeit, ein separates Dateisystem zum Speichern von Bildern einzurichten. Außerdem zentralisiert das Schema die Datenbank, wodurch sie portabler ist und sicherer wird, da die Daten vom Dateisystem isoliert werden. Das Erstellen von Backups erfolgt zudem nahtloser, da Sie eine einzelne MySQL Dump-Dateien 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 Datenvalidierungsregeln und referenzielle Integrität beachtet werden – besonders bei der Verwendung von MySQL-Transaktionen.

In diesem Tutorial verwenden Sie den MySQL BLOB-Datentyp, um Bilder mit PHP unter Ubuntu 18.04 zu speichern.

Voraussetzungen

Um diesem Leitfaden zu folgen, benötigen Sie Folgendes:

Schritt 1 — Erstellen einer Datenbank

Sie beginnen mit der Erstellung einer Beispieldatenbank für Ihr Projekt. Dazu stellen Sie eine SSH-Verbindung zu Ihrem Server her und führen dann den folgenden Befehl aus, um sich bei Ihrem MySQL-Server als root 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 sie 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 auf dem MySQL-Server ein Konto namens test_user und denken Sie daran, PASSWORD durch ein starkes Passwort 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 in der Datenbank test_company volle Berechtigungen 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 Berechtigungstabelle, damit MySQL die Berechtigungen neu lädt:

  • FLUSH PRIVILEGES;

Stellen Sie sicher, dass Sie die folgende Ausgabe sehen:

Output
Query OK, 0 rows affected (0.01 sec)

Nachdem die Datenbank test_company und test_user nun bereit sind, fahren Sie mit dem Erstellen einer Tabelle namens products fort, um dort Beispielprodukte zu speichern. Sie verwenden diese Tabelle später, um Datensätze einzufügen und abzurufen und auszuprobieren, wie MySQL BLOB funktioniert.

Melden Sie sich vom MySQL-Server ab:

  • QUIT;

Melden Sie sich dann erneut mit den Anmeldedaten des test_user an, den Sie erstellt haben:

  • mysql -u test_user -p

Geben Sie auf Aufforderung das Passwort für den test_user ein und drücken Sie ENTER, um fortzufahren. Wechseln Sie als Nächstes zur Datenbank test_company, indem Sie Folgendes eingeben:

  • USE test_company;

Sobald die Datenbank test_company ausgewählt ist, zeigt MySQL Folgendes an:

Output
Database changed

Erstellen Sie als Nächstes eine Tabelle namens products, 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 namens products. Die Tabelle hat vier Spalten:

  • product_id: Diese Spalte verwendet einen BIGINT-Datentyp, um eine große Liste von Produkten mit bis zu 2⁶³-1 Elementen aufzunehmen. Sie haben die Spalte als PRIMARY KEY markiert, um Produkte eindeutig zu identifizieren. Damit MySQL die Erzeugung neuer Kennungen für eingefügte Spalten verwaltet, 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 Zeichenfolgen mit bis zu 50 Zeichen verwaltet. Die Grenze von 50 ist nur ein hypothetischer Wert, der für den Zweck dieses Tutorials verwendet wird.

  • price: Für Demonstrationszwecke enthält Ihre Tabelle namens products eine Spalte namens price, in der der Einzelhandelspreis von Produkten gespeichert wird. Da einige Produkte möglicherweise über veränderliche Werte verfügen (z. B. 23,69, 45,36, 102,99), haben Sie den Datentyp DOUBLE verwendet.

  • product_image: Diese Spalte verwendet einen BLOB-Datentyp, um die tatsächlichen Binärdaten der Produktbilder zu speichern.

Sie haben die InnoDB-Speicher-ENGINE für die Tabelle verwendet, um eine breite Palette von Funktionen einschließlich MySQL-Transaktionen zu unterstützen. Nach der Ausführung zum Erstellen der Tabelle products sehen Sie die folgende Ausgabe:

Output
Query OK, 0 rows affected (0.03 sec)

Melden Sie sich von Ihrem MySQL-Server ab:

  • QUIT;

Sie erhalten folgende Ausgabe:

Output
Bye

Die Tabelle products ist jetzt bereit dazu, Datensätze zu speichern, einschließlich der Bilder von Produkten. Sie werden sie im nächsten Schritt mit einigen Produkten füllen.

Schritt 2 — Erstellen von PHP-Skripten zum Verbinden und Füllen der Datenbank

In diesem Schritt erstellen Sie ein PHP-Skript, das eine Verbindung mit der 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 mit Ihrem Texteditor eine neue Datei:

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

Geben Sie dann die folgenden Informationen in die Datei ein und ersetzen Sie PASSWORD durch das Passwort des test_user, das Sie in Schritt 1 erstellt haben:

/var/www/html/config.php
<?php

define('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 sich mit der MySQL-Datenbank zu verbinden, die Sie in Schritt 1 erstellt haben:

  • DB_NAME: Diese Konstante enthält den Namen der Datenbank test_company.

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

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

  • DB_HOST: Gibt den Server an, auf dem sich die Datenbank befindet. In diesem Fall verwenden Sie den Server localhost.

Die folgende Zeile in Ihrer Datei initiiert ein PHP Data Object (PDO) und stellt eine Verbindung zur MySQL-Datenbank her:

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

Am Ende der Datei haben Sie einige PDO-Attribute festgelegt:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: Dieses Attribut weist PDO an, eine Ausnahme auszulösen, die für Debugging-Zwecke protokolliert werden kann.
  • ATTR_EMULATE_PREPARES, false: Diese Option erhöht die Sicherheit, indem die MySQL-Datenbank-Engine dazu angewiesen wird, die Vorbereitung anstelle von PDO durchzuführen.

Sie schließen die Datei /var/www/html/config.php in zwei PHP-Skripte ein, die Sie als Nächstes zum Einfügen bzw. Abrufen von Datensätzen erstellen werden.

Erstellen Sie zuerst 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 folgende Informationen in die Datei /var/www/html/insert_products.php ein:

/var/www/html/insert_products.php
<?php

require_once 'config.php';

$products = [];

$products[] = [
              'product_name' => 'VIRTUAL SERVERS',
              'price' => 5,
              'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png")
              ];

$products[] = [
              'product_name' => 'MANAGED KUBERNETES',
              'price' => 30,
              'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png")
              ];

$products[] = [
              'product_name' => 'MySQL DATABASES',
              'price' => 15,
              'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" )
              ];

$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 oben die Datei config.php aufgenommen. Dies ist die erste Datei, die Sie zum Definieren der Datenbankvariablen und Verbinden mit der Datenbank erstellt haben. Die Datei initiiert außerdem ein PDO-Objekt und speichert es in einer Variable $pdo.

Als Nächstes haben Sie ein Array mit Produktdaten erstellt, die in die Datenbank eingefügt werden sollen. Neben dem product_name und price, die als Zeichenfolgen bzw. numerische Werte vorbereitet sind, verwendet das Skript die integrierte file_get_contents-Funktion von PHP, um Bilder aus einer externen Quelle zu lesen und 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 Datei /var/www/html/insert_products.php auszuführen, führen Sie sie mit der folgenden URL in Ihrem Browserfenster aus. Denken Sie daran, your-server-IP durch die öffentliche IP-Adresse Ihres Servers zu ersetzen:

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

Nach der Ausführung der Datei sehen Sie eine Erfolgsmeldung in Ihrem Browser, die bestätigt, dass Datensätze in die Datenbank eingefügt wurden.

Eine Erfolgsmeldung zeigt, dass Datensätze in 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 zum Abrufen und Anzeigen dieser Datensätze in Ihrem Browser.

Schritt 3 — Anzeigen von Produktinformationen aus der MySQL-Datenbank

Mit den Informationen und Bildern der Produkte in der Datenbank werden Sie jetzt ein anderes PHP-Skript codieren, das die Produktinformationen abfragt und in Ihrem Browser in einer HTML-Tabelle anzeigt.

Um die Datei zu erstellen, geben Sie Folgendes ein:

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

Geben Sie dann folgende 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['product_id'] . '</td>';
      echo '<td>' . $row['product_name'] . '</td>';
      echo '<td>' . $row['price'] . '</td>';
      echo '<td>' .
      '<img src = "data:image/png;base64,' . base64_encode($row['product_image']) . '" 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 Datei config.php hinzugefügt, um eine Verbindung zur Datenbank herzustellen. Dann haben Sie mit PDO eine SQL-Anweisung 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 unter Verwendung der PHP-Anweisung while() {...} gefüllt. Die Zeile $row = $stmt->fetch(PDO::FETCH_ASSOC) fragt die Datenbank ab und speichert das Ergebnis in der Variable $row als multidimensionales Array, das Sie dann mit der Syntax $row['column_name'] in einer HTML-Tabellenspalte angezeigt haben.

Die Bilder aus der Spalte product_image sind in den <img src = "">-Tags eingeschlossen. Sie haben die Attribute width und height verwendet, um die Bilder in eine kleinere Größe zu ändern, die in die HTML-Tabellenspalte passt.

Um die im BLOB-Datentyp enthaltenen Daten wieder in Bilder zu konvertieren, haben Sie die native PHP-Funktion base64_encode und die folgende Syntax für das Data URI-Schema verwendet:

data:media_type;base64, base_64_encoded_data

In diesem Fall ist image/png der media_type und die Base64-codierte Zeichenfolge aus der Spalte product_image ist base_64_encoded_data.

Führen Sie als Nächstes die Datei display_products.php in einem Webbrowser aus, indem Sie die folgende Adresse eingeben:

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

Nachdem die Datei display_products.php in Ihrem Browser ausgeführt wurde, sehen Sie eine HTML-Tabelle mit einer Liste von Produkten und zugehörigen Bildern.

Liste von Produkten aus der MySQL-Datenbank

Dadurch wird bestätigt, dass das PHP-Skript zum Abrufen von Bildern aus MySQL wie erwartet funktioniert.

Zusammenfassung

In diesem Leitfaden haben Sie den MySQL BLOB-Datentyp verwendet, um Bilder mit PHP unter Ubuntu 18.04 zu speichern. Sie haben auch die grundlegenden Vorteile des Speicherns von Bildern in einer Datenbank anstelle eines Dateisystems kennengelernt. Diese schließen Portabilität, Sicherheit und einfache Backups ein. Wenn Sie eine Anwendung wie ein Studentenportal oder oder eine Mitarbeiterdatenbank erstellen, die verlangt, dass Informationen und zugehörige Bilder zusammen gespeichert werden, kann diese Technologie sehr nützlich sein.

Weitere Informationen zu den unterstützten Datentypen in MySQL finden Sie im Leitfaden zu MySQL-Datentypen. Wenn Sie mehr über MySQL und PHP erfahren möchten, lesen Sie die folgenden Tutorials:

Creative Commons License