データベース活用:MariaDB BLOB 画像の PHP による表示方法
PHP で MariaDB BLOB から画像を表示する
このチュートリアルでは、PHP を使用して MariaDB データベース内の BLOB 型の画像データをフェッチし、Web ページに表示する方法を説明します。
前提条件
- PHP がインストールされている
- MariaDB データベースが設定されている
- 画像データが BLOB 型でテーブルに格納されている
手順
- データベース接続
まず、PHP スクリプト内で MariaDB データベースに接続する必要があります。
<?php
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "database_name";
$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
?>
- 画像データのフェッチ
次に、画像データを含む BLOB 型の列からデータを取得するクエリを実行します。
<?php
$sql = "SELECT image_data FROM images WHERE image_id = 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$imageData = $row["image_data"];
}
} else {
echo "No image found";
}
$conn->close();
?>
- 画像の表示
最後に、フェッチされた画像データを base64_encode()
関数を使用してエンコードし、<img>
タグを使用して Web ページに表示します。
<?php
$imageType = exif_image_type($imageData);
if ($imageType === IMAGETYPE_JPEG) {
$mimeType = "image/jpeg";
} else if ($imageType === IMAGETYPE_PNG) {
$mimeType = "image/png";
} else {
echo "Invalid image type";
exit;
}
$encodedImageData = base64_encode($imageData);
echo "<img src=\"data:$mimeType;base64,$encodedImageData\" alt=\"Image\">";
?>
補足
- 上記のコードはあくまで一例であり、実際の状況に合わせて調整する必要があります。
- 画像データのサイズが大きい場合は、メモリ不足などの問題が発生する可能性があります。その場合は、画像データを分割して処理するなどの対策が必要です。
- セキュリティ上の理由から、ユーザーがアップロードした画像データを表示する場合は、適切な対策を講じる必要があります。
<?php
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "database_name";
$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT image_data FROM images WHERE image_id = 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$imageData = $row["image_data"];
}
} else {
echo "No image found";
}
$conn->close();
$imageType = exif_image_type($imageData);
if ($imageType === IMAGETYPE_JPEG) {
$mimeType = "image/jpeg";
} else if ($imageType === IMAGETYPE_PNG) {
$mimeType = "image/png";
} else {
echo "Invalid image type";
exit;
}
$encodedImageData = base64_encode($imageData);
echo "<img src=\"data:$mimeType;base64,$encodedImageData\" alt=\"Image\">";
?>
このサンプルコードは、以下の手順を実行します。
-
$dbhost
、$dbuser
、$dbpass
、$dbname
変数にデータベース接続情報を設定します。mysqli()
関数を使用してデータベースに接続します。- 接続に失敗した場合、エラーメッセージを出力して終了します。
-
$sql
変数に画像データを取得する SQL クエリを設定します。mysqli_query()
関数を使用してクエリを実行します。- クエリ結果が 0 件の場合、「No image found」というメッセージを出力します。
mysqli_fetch_assoc()
関数を使用して取得したデータから BLOB 型の画像データを取得します。
-
exif_image_type()
関数を使用して画像データの種類を取得します。- 画像データの種類に基づいて、
$mimeType
変数に MIME タイプを設定します。 base64_encode()
関数を使用して画像データを Base64 エンコードします。<img>
タグを使用して Base64 エンコードされた画像データを Web ページに表示します。
BLOB から画像を表示するその他の方法
ヘッダーを使用してバイナリデータを直接出力する
この方法は、シンプルで効率的ですが、HTML 構造が複雑になり、可読性が低くなる可能性があります。
<?php
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "database_name";
$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT image_data FROM images WHERE image_id = 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$imageData = $row["image_data"];
header("Content-Type: image/jpeg"); // MIME タイプを設定
echo $imageData; // バイナリデータを直接出力
}
} else {
echo "No image found";
}
$conn->close();
?>
PHP ライブラリを使用する
画像処理に特化した PHP ライブラリを使用すると、コードをより簡潔で読みやすくすることができます。
Intervention Image は、画像処理に人気の高い PHP ライブラリです。このライブラリを使用して、BLOB から画像を読み込み、表示することができます。
<?php
require 'vendor/autoload.php';
use Intervention\Image\ImageManager;
$dbhost = "localhost";
$dbuser = "username";
$dbpass = "password";
$dbname = "database_name";
$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT image_data FROM images WHERE image_id = 1";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$imageData = $row["image_data"];
$manager = new ImageManager();
$image = $manager->make($imageData); // BLOB データから Image オブジェクトを作成
$image->display(); // 画像を表示
}
} else {
echo "No image found";
}
$conn->close();
?>
php mariadb blob