著者は、 Write for DOnations プログラムの一環として、 Girls WhoCodeを選択して寄付を受け取りました。

序章

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

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

これはMySQLが BLOB データ型が入ります。 このプログラミングアプローチにより、画像を保存するための個別のファイルシステムを作成する必要がなくなります。 このスキームはまた、データベースを一元化し、データがファイルシステムから分離されているため、データベースの移植性と安全性を高めます。 すべてのデータを含む単一のMySQLダンプファイルを作成できるため、バックアップの作成もよりシームレスになります。

データの取得はより高速であり、レコードを作成するときに、特に MySQLトランザクションを使用する場合に、データ検証ルールと参照整合性が維持されることを確認できます。

このチュートリアルでは、MySQLを使用します BLOB Ubuntu18.04でPHPを使用して画像を保存するデータ型。

前提条件

このガイドに従うには、次のものが必要です。

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

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

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

  1. sudo mysql -u root -p

MySQLデータベースのrootパスワードを入力し、 ENTER 続ける。

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

  1. CREATE DATABASE test_company;

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

Output
Query OK, 1 row affected (0.01 sec)

次に、 test_user MySQLサーバーのアカウントを作成し、交換することを忘れないでください PASSWORD 強力なパスワードを使用する場合:

  1. CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

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

Output
Query OK, 0 rows affected (0.01 sec)

付与するには test_user の完全な特権 test_company データベース、実行:

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

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

Output
Query OK, 0 rows affected (0.01 sec)

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

  1. FLUSH PRIVILEGES;

次の出力が表示されていることを確認してください。

Output
Query OK, 0 rows affected (0.01 sec)

今では test_company データベースと test_user 準備ができたら、作成に進みます products サンプル製品を保管するためのテーブル。 後でこのテーブルを使用してレコードを挿入および取得し、MySQLがどのように機能するかを示します BLOB 動作します。

MySQLサーバーからログアウトします。

  1. QUIT;

次に、の資格情報を使用して再度ログインします。 test_user 作成したもの:

  1. mysql -u test_user -p

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

  1. USE test_company;

一度 test_company データベースを選択すると、MySQLは次のように表示します。

Output
Database changed

次に、 products 実行によるテーブル:

  1. 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⁶³-1アイテムまでの製品の大規模なリストに対応するためのデータ型。 列を次のようにマークしました PRIMARY KEY 製品を一意に識別するため。 MySQLが挿入された列の新しい識別子の生成を処理するために、キーワードを使用しました AUTO_INCREMENT.

  • product_name:この列には、製品の名前が表示されます。 あなたは使用しました VARCHAR このフィールドは通常、最大で最大の英数字を処理するため、データ型 50 文字-の制限 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サーバーからログアウトします。

  1. QUIT;

次の出力が得られます

Output
Bye

The products これで、テーブルに商品の画像を含むいくつかのレコードを保存する準備が整いました。次のステップで、いくつかの商品をテーブルに入力します。

ステップ2—データベースに接続してデータを取り込むためのPHPスクリプトを作成する

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

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

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

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

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

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

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

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

  • DB_USER :この変数は test_user ユーザー名。

  • DB_PASSWORD :この定数はMySQLを格納します PASSWORDtest_user アカウント。

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

ファイルの次の行は、PHP Data Object (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:このオプションは、MySQLデータベースエンジンにPDOの代わりに準備を行うように指示することでセキュリティを強化します。

あなたは含まれます /var/www/html/config.php 次にレコードを挿入および取得するためにそれぞれ作成する2つのPHPスクリプトのファイル。

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

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

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

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

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

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

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

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

を実行するには /var/www/html/insert_products.php ファイルの場合は、次のURLを使用してブラウザウィンドウで実行します。 交換することを忘れないでください your-server-IP サーバーのパブリックIPアドレスを使用します。

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

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

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

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

データベース内の製品の情報と画像を使用して、ブラウザーのHTMLテーブルに製品の情報を照会して表示する別のPHPスクリプトをコーディングします。

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

  1. 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['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>

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

ここに再び含まれています config.php データベースに接続するためのファイル。 次に、PDOを使用してSQLステートメントを準備して実行し、からすべてのアイテムを取得します。 products を使用したテーブル SELECT * FROM products 指図。

次に、HTMLテーブルを作成し、PHPを使用して製品のデータを入力しました。 while() {...} 声明。 この線 $row = $stmt->fetch(PDO::FETCH_ASSOC) データベースにクエリを実行し、結果を $row 多次元配列としての変数。これを使用してHTMLテーブルの列に表示します。 $row['column_name'] 構文。

からの画像 product_image 列は内部に囲まれています <img src = ""> タグ。 あなたは使用しました widthheight HTMLテーブルの列に収まるサイズに画像のサイズを変更するための属性。

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

data:media_type;base64, base_64_encoded_data

この場合、 image/png それは media_type そしてその Base64 からエンコードされた文字列 product_image 列は base_64_encoded_data.

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

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

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

これにより、MySQLから画像を取得するためのPHPスクリプトが期待どおりに機能していることが確認されます。

結論

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

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