de auteur selecteerde meisjes die coderen om een donatie te ontvangen als onderdeel van het Schrijf voor donaties programma.
Inleiding
een binair groot Object (BLOB
) is een MySQL-gegevenstype dat binaire gegevens zoals afbeeldingen, multimedia en PDF-bestanden kan opslaan.
bij het maken van toepassingen die een nauw gekoppelde database vereisen waarin afbeeldingen gesynchroniseerd moeten zijn met gerelateerde gegevens (bijvoorbeeld een werknemersportaal, een studentendatabase of een financiële toepassing), is het misschien handig om afbeeldingen zoals paspoortfoto’ s en handtekeningen van studenten op te slaan in een MySQL-database naast andere gerelateerde informatie.
Hier komt het MySQL BLOB
gegevenstype voor. Deze programmeerbenadering elimineert de noodzaak voor het creëren van een apart bestandssysteem voor het opslaan van beelden. De regeling centraliseert ook de database, waardoor het meer draagbaar en veilig omdat de gegevens zijn geïsoleerd van het bestandssysteem. Het maken van back-ups is ook naadloos, omdat u een enkele MySQL dump bestand dat al uw gegevens bevat kunt maken.
Gegevens ophalen is sneller, en bij het maken van records kunt u er zeker van zijn dat gegevensvalidatieregels en referentiële integriteit worden gehandhaafd, vooral bij het gebruik van MySQL-transacties.
in deze tutorial gebruikt u het MySQL BLOB
gegevenstype om afbeeldingen met PHP op te slaan op Ubuntu 18.04.
vereisten
om samen met deze handleiding te volgen, hebt u het volgende nodig::
- een Ubuntu 18.04-server die is geconfigureerd met de initiële serverinstelling met Ubuntu 18.04 en een niet-root-gebruiker met
sudo
– privileges. - Apache, MySQL, en PHP ingesteld door het volgen van de handleiding over het installeren van Linux, Apache, MySQL, PHP (LAMP) stack op Ubuntu 18.04. Voor deze tutorial is het niet nodig om virtuele hosts te maken, dus je kunt Stap 4 overslaan.
Stap 1 – een Database aanmaken
u begint met het aanmaken van een voorbeelddatabase voor uw project. Om dit te doen, SSH in op uw server en voer dan het volgende commando uit om in te loggen op uw MySQL server als root:
- sudo mysql -u root -p
voer het root wachtwoord van uw MySQL database in en druk op ENTER
om verder te gaan.
voer dan het volgende commando uit om een database aan te maken. In deze tutorial noemen we het test_company
:
- CREATE DATABASE test_company;
zodra de database is gemaakt, ziet u de volgende uitvoer:
OutputQuery OK, 1 row affected (0.01 sec)
maak vervolgens een test_user
account aan op de MySQL server en vergeet niet om PASSWORD
te vervangen door een sterk wachtwoord:
- CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';
u zult de volgende uitvoer zien:
OutputQuery OK, 0 rows affected (0.01 sec)
verlenen test_user
volledige rechten op de test_company
database uitvoeren:
- GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';
Zorg ervoor dat je de volgende output:
OutputQuery OK, 0 rows affected (0.01 sec)
ten Slotte spoel de privileges tabel om MySQL te laden van de rechten:
- FLUSH PRIVILEGES;
Zorg ziet u de volgende uitvoer:
OutputQuery OK, 0 rows affected (0.01 sec)
Nu de test_company
database en test_user
zijn er klaar voor, u gaat op voor het maken van een products
tabel voor het opslaan van sample producten. U zult deze tabel later gebruiken om records in te voegen en op te halen om te laten zien hoe MySQL BLOB
werkt.
afmelden bij de MySQL-server:
- QUIT;
log vervolgens opnieuw in met de referenties van de test_user
die u hebt aangemaakt:
- mysql -u test_user -p
voer het wachtwoord voor de test_user
in en druk op ENTER
om door te gaan. Ga vervolgens naar de test_company
database door het volgende te typen:
- USE test_company;
zodra de test_company
database is geselecteerd, wordt MySQL weergegeven:
OutputDatabase changed
maak vervolgens een products
– tabel door het uitvoeren van:
- CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;
dit commando maakt een tabel aan met de naam products
. De tabel heeft vier kolommen:
-
product_id
: Deze kolom gebruikt eenBIGINT
gegevenstype om een grote lijst van producten tot een maximum van 233-1 items op te nemen. U hebt de kolom gemarkeerd alsPRIMARY KEY
om producten uniek te identificeren. Om ervoor te zorgen dat MySQL het genereren van nieuwe ID ‘ s voor ingevoegde kolommen kan verwerken, hebt u het trefwoordAUTO_INCREMENT
gebruikt. -
product_name
: deze kolom bevat de namen van de producten. U hebt hetVARCHAR
gegevenstype gebruikt omdat dit veld over het algemeen alfanumerieke tekens behandelt tot een maximum van50
tekens—de limiet van50
is slechts een hypothetische waarde die wordt gebruikt voor deze tutorial. -
price
: voor demonstratiedoeleinden bevat uw tabelproducts
de kolomprice
om de kleinhandelsprijs van producten op te slaan. Omdat sommige producten zwevende waarden kunnen hebben (bijvoorbeeld 23.69, 45.36, 102.99), hebt u hetDOUBLE
gegevenstype gebruikt. -
product_image
: deze kolom gebruikt eenBLOB
gegevenstype om de werkelijke binaire gegevens van de afbeeldingen van de producten op te slaan.
u hebt de InnoDB
opslag ENGINE
voor de tabel gebruikt om een breed scala aan functies te ondersteunen, waaronder MySQL-transacties. Na het uitvoeren van dit voor het maken van de products
tabel, zult u de volgende uitvoer zien:
OutputQuery OK, 0 rows affected (0.03 sec)
uitloggen bij uw MySQL server:
- QUIT;
u krijgt de volgende uitvoer
OutputBye
de tabel products
is nu klaar om enkele records op te slaan, inclusief afbeeldingen van producten, en u zult deze in de volgende stap vullen met enkele producten.
Stap 2-PHP-Scripts aanmaken voor het verbinden en vullen van de Database
in deze stap maak je een PHP-script aan dat verbinding maakt met de MySQL-database die je in Stap 1 hebt aangemaakt. Het script zal drie voorbeeldproducten voorbereiden en deze invoegen in de products
tabel.
om de PHP-code aan te maken, open je een nieuw bestand met je Teksteditor:
- sudo nano /var/www/html/config.php
voer vervolgens de volgende informatie in het bestand in en vervang PASSWORD
door het test_user
wachtwoord dat u in Stap 1 hebt aangemaakt:
<?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);
het bestand opslaan en sluiten.
in dit bestand hebt u vier PHP constanten gebruikt om verbinding te maken met de MySQL database die u in stap hebt aangemaakt 1:
-
DB_NAME
: deze constante bevat de naam van detest_company
database. -
DB_USER
: deze variabele bevat detest_user
gebruikersnaam. -
DB_PASSWORD
: deze constante slaat de MySQLPASSWORD
van hettest_user
account op. -
DB_HOST
: dit vertegenwoordigt de server waar de database zich bevindt. In dit geval gebruikt u delocalhost
server.
de volgende regel in uw bestand initieert een PHP Data Object (PDO) en verbindt met de MySQL database:
...$pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);...
tegen het einde van het bestand hebt u een paar PDO-attributen ingesteld:
-
ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION
: Dit attribuut instrueert PDO om een uitzondering die kan worden gelogd voor debugging doeleinden gooien. -
ATTR_EMULATE_PREPARES, false
: deze optie verhoogt de veiligheid door de MySQL database engine te vertellen om de voorbereiding te doen in plaats van PDO.
u zult het /var/www/html/config.php
bestand opnemen in twee PHP scripts die u vervolgens zult aanmaken voor het invoegen en ophalen van records.
maak eerst het /var/www/html/insert_products.php
PHP-script aan voor het invoegen van records in de productentabel:
- sudo nano /var/www/html/insert_products.php
voeg vervolgens de volgende informatie toe aan het /var/www/html/insert_products.php
bestand:
<?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";
het bestand opslaan en sluiten.
in het bestand hebt u het config.php
bestand bovenaan opgenomen. Dit is het eerste bestand dat je hebt gemaakt voor het definiëren van de database variabelen en het verbinden met de database. Het bestand initieert ook een PDO-object en slaat het op in een $pdo
variabele.
vervolgens hebt u een array gemaakt van de gegevens van de producten die in de database moeten worden ingevoegd. Afgezien van de product_name
en price
, die zijn voorbereid als tekenreeksen en numerieke waarden, gebruikt het script PHP ‘ s ingebouwde file_get_contents
functie om afbeeldingen van een externe bron te lezen en deze als tekenreeksen door te geven aan de product_image
kolom.
vervolgens hebt u een SQL-statement voorbereid en het PHP foreach{...}
– statement gebruikt om elk product in de database in te voegen.
om het /var/www/html/insert_products.php
bestand uit te voeren, voert u het uit in uw browservenster met de volgende URL. Vergeet niet your-server-IP
te vervangen door het openbare IP-adres van uw server:
http://your-server-IP/insert_products.php
na het uitvoeren van het bestand, ziet u een succesbericht in uw browser waarin wordt bevestigd dat records in de database zijn geplaatst.
u hebt met succes drie records met productafbeeldingen in de tabel products
ingevoegd. In de volgende stap, zult u een PHP-script voor het ophalen van deze records en het weergeven van hen in uw browser.
Stap 3-productinformatie weergeven uit de MySQL-Database
met de productinformatie en afbeeldingen in de database, ga je nu een ander PHP-script coderen dat de productinformatie opvraagt en weergeeft in een HTML-tabel in je browser.
typ het volgende om het bestand aan te maken:
- sudo nano /var/www/html/display_products.php
voer vervolgens de volgende informatie in het bestand in:
<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>
sla de wijzigingen in het bestand op en sluit het.
hier hebt u opnieuw het config.php
bestand toegevoegd om verbinding te maken met de database. Vervolgens heb je een SQL statement voorbereid en uitgevoerd met PDO om alle items uit de products
tabel op te halen met behulp van het SELECT * FROM products
Commando.
vervolgens hebt u een HTML-tabel aangemaakt en deze ingevuld met de gegevens van de producten met behulp van het PHP while() {...}
statement. De regel $row = $stmt->fetch(PDO::FETCH_ASSOC)
bevraagt de database en slaat het resultaat op in de variabele $row
als een multidimensionale array, die u vervolgens in een HTML-tabelkolom hebt weergegeven met behulp van de syntaxis $row
.
de afbeeldingen uit de kolom product_image
zijn ingesloten in de tags <img src = "">
. U hebt de attributen width
en height
gebruikt om de grootte van de afbeeldingen te verkleinen tot een kleiner formaat dat past in de kolom HTML-tabel.
om de gegevens van het BLOB
gegevenstype terug naar afbeeldingen te converteren, hebt u de ingebouwde PHP base64_encode
functie en de volgende syntaxis gebruikt voor het Data URI schema:
data:media_type;base64, base_64_encoded_data
in dit geval is de image/png
de media_type
en de Base64
gecodeerde tekenreeks uit de kolom product_image
de base_64_encoded_data
.
voer vervolgens het display_products.php
– bestand uit in een webbrowser door het volgende adres in te typen:
http://your-server-IP/display_products.php
na het draaien van het display_products.php
bestand in uw browser, ziet u een HTML tabel met een lijst van producten en bijbehorende afbeeldingen.
dit bevestigt dat het PHP-script voor het ophalen van afbeeldingen van MySQL werkt zoals verwacht.
conclusie
in deze gids gebruikte u het MySQL BLOB
gegevenstype om afbeeldingen met PHP op Ubuntu 18.04 op te slaan en weer te geven. Je hebt ook gezien de fundamentele voordelen van het opslaan van afbeeldingen in een database in tegenstelling tot het opslaan in een bestandssysteem. Deze omvatten draagbaarheid, beveiliging en het gemak van back-up. Als u een applicatie bouwt, zoals een studentenportaal of een database van medewerkers, waarvoor informatie en gerelateerde afbeeldingen samen moeten worden opgeslagen, dan kan deze technologie voor u van groot nut zijn.
voor meer informatie over de ondersteunde gegevenstypen in MySQL volg de MySQL Data Types guide. Als u geïnteresseerd bent in verdere inhoud met betrekking tot MySQL en PHP, bekijk dan de volgende tutorials:
- hoe paginering in MySQL met PHP op Ubuntu te implementeren 18.04
- hoe de PDO PHP-extensie te gebruiken om MySQL-transacties in PHP uit te voeren op Ubuntu 18.04