hoe het MySQL BLOB data Type te gebruiken om afbeeldingen op te slaan met PHP op Ubuntu 18.04

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:

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

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

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

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

Output
Database 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 een BIGINT gegevenstype om een grote lijst van producten tot een maximum van 233-1 items op te nemen. U hebt de kolom gemarkeerd als PRIMARY 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 trefwoord AUTO_INCREMENTgebruikt.

  • product_name: deze kolom bevat de namen van de producten. U hebt het VARCHAR gegevenstype gebruikt omdat dit veld over het algemeen alfanumerieke tekens behandelt tot een maximum van 50 tekens—de limiet van 50 is slechts een hypothetische waarde die wordt gebruikt voor deze tutorial.

  • price: voor demonstratiedoeleinden bevat uw tabel products de kolom price om de kleinhandelsprijs van producten op te slaan. Omdat sommige producten zwevende waarden kunnen hebben (bijvoorbeeld 23.69, 45.36, 102.99), hebt u het DOUBLE gegevenstype gebruikt.

  • product_image: deze kolom gebruikt een BLOB 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:

Output
Query OK, 0 rows affected (0.03 sec)

uitloggen bij uw MySQL server:

  • QUIT;

u krijgt de volgende uitvoer

Output
Bye

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:

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

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 de test_company database.

  • DB_USER : deze variabele bevat de test_user gebruikersnaam.

  • DB_PASSWORD : deze constante slaat de MySQL PASSWORD van het test_user account op.

  • DB_HOST: dit vertegenwoordigt de server waar de database zich bevindt. In dit geval gebruikt u de localhost 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:

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

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.

een succesbericht waaruit blijkt dat records in de database

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:

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

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.

lijst van producten uit de MySQL-database

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

Leave a Reply

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.