MySQL BLOBデータ型を使用してUbuntu18.04でPHPで画像を保存する方法

著者は、Write for DOnationsプログラムの一環として、寄付を受け取るためにコードを書く女の子を選択しました。

はじめに

バイナリラージオブジェクト(BLOB)は、イメージ、マルチメディア、PDFファイルなどのバイナリデータを格納できるMySQLデータ型です。

画像を関連データと同期させる密結合データベースを必要とするアプリケーションを作成する場合(従業員ポータル、学生データベース、財務アプリケーションなど)、学生のパスポート写真や署名などの画像を他の関連情報と一緒にMySQLデータベースに保存すると便利な場合があります。

これは、MySQLBLOBデータ型が入ってくる場所です。 このプログラミング手法では、イメージを格納するために別のファイルシステムを作成する必要がありません。 また、このスキームはデータベースを一元化し、データがファイルシステムから分離されているため、移植性と安全性が向上します。 すべてのデータを含む単一のMySQLダンプファイルを作成できるため、バックアップの作成もよりシームレスになります。

データの取得は高速であり、レコードを作成するときには、特にMySQLトランザクションを使用するときにデータ検証ルールと参照整合性が維持されることを確このチュートリアルでは、MysqlBLOBデータ型を使用して、Ubuntu18.04でPHPでイメージを保存します。

前提条件

このガイドと一緒に従うには、次のものが必要です:

  • Ubuntu18.04で初期サーバー設定を使用して構成されたUbuntu18.04サーバーと、sudo権限を持つ非rootユーザー。Ubuntu18.04にLinux、Apache、MySQL、PHP(LAMP)スタックをインストールする方法のガイドに従って、Apache、MySQL、およびPHPをセットアップします。 このチュートリアルでは、仮想ホストを作成する必要はないため、手順4をスキップできます。

ステップ1—データベースの作成

まず、プロジェクトのサンプルデータベースを作成します。 これを行うには、サーバーにSSHで接続し、次のコマンドを実行してMySQLサーバーにrootとしてログインします:

  • sudo mysql -u root -p

MySQLデータベースのrootパスワードを入力し、ENTERを押して続行します。

次に、次のコマンドを実行してデータベースを作成します。 このチュートリアルでは、それに名前を付けますtest_company:

  • CREATE DATABASE test_company;

データベースが作成されると、次の出力が表示されます:

Output
Query OK, 1 row affected (0.01 sec)

次に、MySQLサーバー上にtest_userアカウントを作成し、PASSWORDを強力なパスワードに置き換えることを忘れないでください:

  • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

次の出力が表示されます:

Output
Query OK, 0 rows affected (0.01 sec)

test_usertest_companyデータベースに対する完全な権限を付与するには、次のコマンドを実行します:

  • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

次の出力が得られることを確認してください:

Output
Query OK, 0 rows affected (0.01 sec)

最後に、MySQLが権限をリロードするために特権テーブルをフラッシュします:

  • FLUSH PRIVILEGES;

次の出力が表示されていることを確認します:

Output
Query OK, 0 rows affected (0.01 sec)

これでtest_companyデータベースとtest_userの準備ができたので、サンプル製品を格納するためのproductsテーブルの作成に進みます。 後でこのテーブルを使用してレコードを挿入および取得し、MySQLBLOBがどのように機能するかを説明します。

MySQLサーバーからログアウトする:

  • QUIT;

次に、作成したtest_userの資格情報で再度ログインします:

  • mysql -u test_user -p

プロンプトが表示されたら、test_userのパスワードを入力し、ENTERを押して続行します。 次に、次のように入力して、test_companyデータベースに切り替えます:

  • USE test_company;

test_companyデータベースが選択されると、MySQLは表示されます:

Output
Database changed

次に、次を実行してproductsテーブルを作成します:

  • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

このコマンドは、productsという名前のテーブルを作成します。 テーブルには4つの列があります:

  • product_id: この列はBIGINTデータ型を使用して、最大2º3-1項目までの製品の大規模なリストに対応します。 商品を一意に識別するために、列をPRIMARY KEYとしてマークしました。 MySQLが挿入された列の新しい識別子の生成を処理するために、キーワードAUTO_INCREMENTを使用しました。

  • product_name: この列には、製品の名前が格納されます。 このフィールドは通常、最大50文字までの英数字を処理するため、VARCHARデータ型を使用しました。50の制限は、このチュートリアルの目的で使用される架空の値です。

  • price: デモ用に、productsテーブルには、製品の小売価格を格納するprice列が含まれています。 一部の製品には浮動小数点値(たとえば、23.69、45.36、102.99)がある可能性があるため、DOUBLEデータ型を使用しました。

  • product_image: この列は、BLOBデータ型を使用して、製品の画像の実際のバイナリデータを格納します。

テーブルにInnoDBストレージENGINEを使用して、MySQLトランザクションを含む幅広い機能をサポートしました。 これを実行してproductsテーブルを作成すると、次の出力が表示されます:

Output
Query OK, 0 rows affected (0.03 sec)

MySQLサーバーからのログアウト:

  • QUIT;

次の出力が得られます

Output
Bye

productsテーブルは、製品の画像を含むいくつかのレコードを保存する準備ができており、次の手順でいくつかの製品を入力します。

ステップ2—データベースに接続および移入するためのPHPスクリプトの作成

このステップでは、ステップ1で作成したMySQLデータベースに接続するPHPスク このスクリプトは、3つのサンプル製品を準備し、それらをproductsテーブルに挿入します。

PHPコードを作成するには、テキストエディタで新しいファイルを開きます:

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

次に、ファイルに次の情報を入力し、PASSWORDを手順1で作成したtest_userパスワードに置き換えます。

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

ファイルを保存して閉じます。

このファイルでは、ステップで作成したMySQLデータベースに接続するために四つのPHP定数を使用しました1:

  • DB_NAME : この定数は、test_companyデータベースの名前を保持します。

  • DB_USER : この変数はtest_userユーザー名を保持します。

  • DB_PASSWORD : この定数には、test_userアカウントのMySQLPASSWORDが格納されます。

  • DB_HOST: これは、データベースが存在するサーバーを表します。 この場合、localhostサーバーを使用しています。

ファイル内の次の行は、PHPデータオブジェクト(PDO)を開始し、MySQLデータベースに接続します:

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

ファイルの最後に向かって、いくつかのPDO属性を設定しました:

  • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION: この属性は、デバッグ目的でログに記録できる例外をスローするようにPDOに指示します。
  • ATTR_EMULATE_PREPARES, false: このオプションは、PDOの代わりにprepareを実行するようにMySQLデータベースエンジンに指示することでセキュリティを向上させます。

レコードの挿入と取得のために次に作成する二つのPHPスクリプトに/var/www/html/config.phpファイルを含めます。

まず、productsテーブルにレコードを挿入するための/var/www/html/insert_products.phpPHPスクリプトを作成します:

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

次に、/var/www/html/insert_products.phpファイルに次の情報を追加します。

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

ファイルを保存して閉じます。

ファイルの先頭にconfig.phpファイルが含まれています。 これは、データベース変数を定義し、データベースに接続するために作成した最初のファイルです。 このファイルはPDOオブジェクトも開始し、それを$pdo変数に格納します。

次に、データベースに挿入する製品のデータの配列を作成しました。 それぞれ文字列と数値として用意されているproduct_namepriceとは別に、スクリプトはPHPの組み込みfile_get_contents関数を使用して外部ソースから画像を読み取り、文字列としてproduct_image列に渡します。

次に、SQLステートメントを準備し、PHPforeach{...}ステートメントを使用して各製品をデータベースに挿入しました。

/var/www/html/insert_products.phpファイルを実行するには、次のURLを使用してブラウザウィンドウで実行します。 必ずyour-server-IPをサーバーのパブリックIPアドレスに置き換えてください:

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

ファイルを実行すると、データベースにレコードが挿入されたことを確認する成功メッセージがブラウザに表示されます。

データベースにレコードが挿入されたことを示す成功メッセージ

製品イメージを含む三つのレコードがproductsテーブルに正常に挿入されました。 次のステップでは、これらのレコードを取得してブラウザに表示するためのPHPスクリプトを作成します。

ステップ3—MySQLデータベースからの製品情報の表示

データベース内の製品情報と画像を使用して、ブラウザのHTMLテーブルに製品情報を照会して表示する別のPHP

ファイルを作成するには、次のように入力します:

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

次に、ファイルに次の情報を入力します。

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

ファイルへの変更を保存して閉じます。

ここでは、データベースに接続するためにconfig.phpファイルを再度含めました。 次に、PDOを使用してSQL文を準備して実行し、SELECT * FROM productsコマンドを使用してproducts表からすべての項目を取得しました。

次に、HTMLテーブルを作成し、PHPwhile() {...}ステートメントを使用して製品のデータを入力しました。 行$row = $stmt->fetch(PDO::FETCH_ASSOC)はデータベースを照会し、結果を多次元配列として$row変数に格納し、$row構文を使用してHTMLテーブル列に表示します。

product_image列の画像は<img src = "">タグの内側に囲まれています。 width属性とheight属性を使用して、HTMLテーブル列に収まる小さいサイズに画像のサイズを変更しました。

BLOBデータ型によって保持されているデータを画像に変換するには、組み込みのPHPbase64_encode関数とデータURIスキームの次の構文を使用しました:

data:media_type;base64, base_64_encoded_data

この場合、image/pngmedia_typeであり、product_image列のBase64エンコードされた文字列はbase_64_encoded_dataです。

次に、次のアドレスを入力して、webブラウザでdisplay_products.phpファイルを実行します:

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

ブラウザでdisplay_products.phpファイルを実行すると、製品と関連する画像のリストを含むHTMLテーブルが表示されます。

MySQLデータベースからの製品のリスト

これは、MySQLから画像を取得するためのPHPスクリプトが期待どおりに動作していることを確認します。このガイドでは、MysqlBLOBデータ型を使用して、Ubuntu18.04のPHPでイメージを保存および表示しました。 また、画像をファイルシステムに保存するのではなく、データベースに保存することの基本的な利点も見てきました。 これには、移植性、セキュリティ、およびバックアップの容易さが含まれます。 学生のポータルや従業員のデータベースなど、情報や関連する画像を一緒に保存する必要があるアプリケーションを構築する場合、この技術は非常に役立

MySQLでサポートされているデータ型の詳細については、”MySQLデータ型ガイド”を参照してください。 MySQLとPHPに関連するその他のコンテンツに興味がある場合は、次のチュートリアルをチェックしてくださ:

  • Ubuntu18.04でPHPを使用してMysqlでページネーションを実装する方法
  • PDO PHP拡張を使用してUbuntu18.04でPHPでMySQLトランザクションを実行する方法

Leave a Reply

コメントを残す

メールアドレスが公開されることはありません。