Der Autor hat Girls Who Code dazu ausgewählt, im Rahmen des Programms Write for DOnations eine Spende zu erhalten.
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.
Um diesem Leitfaden zu folgen, benötigen Sie Folgendes:
sudo
-Berechtigungen konfiguriert wurde.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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputQuery 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:
OutputDatabase 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:
OutputQuery OK, 0 rows affected (0.03 sec)
Melden Sie sich von Ihrem MySQL-Server ab:
- QUIT;
Sie erhalten folgende Ausgabe:
OutputBye
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.
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:
<?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:
<?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.
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.
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:
<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.
Dadurch wird bestätigt, dass das PHP-Skript zum Abrufen von Bildern aus MySQL wie erwartet funktioniert.
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:
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!