PHPとMySQLで画像をデータベースに格納・取得:初心者向けチュートリアル

2024-07-03

PHPを使ってMySQLデータベースに画像を格納・取得する方法

このチュートリアルでは、PHPとMySQLデータベースを使って画像を格納・取得する方法を説明します。画像をデータベースに保存することで、Webアプリケーションで簡単に管理・表示することができます。

必要なもの

  • PHPがインストールされたWebサーバー
  • MySQLデータベース
  • 画像ファイル

手順

  1. データベーステーブルの作成

    まず、MySQLデータベースに画像を格納するためのテーブルを作成する必要があります。以下のSQLクエリを使用して、imagesという名前のテーブルを作成できます。

    CREATE TABLE images (
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(255) NOT NULL,
        type VARCHAR(255) NOT NULL,
        data BLOB NOT NULL
    );
    

    このテーブルには、以下のカラムがあります。

    • id: 画像ID (自動的に増加する主キー)
    • name: 画像ファイル名
    • type: 画像タイプ (例: "image/jpeg", "image/png")
    • data: バイナリ形式の画像データ
  2. 画像をアップロードするには、HTMLフォームとPHPスクリプトを使用します。以下の例では、upload.phpというスクリプトを使用して、imagesディレクトリに画像をアップロードします。

    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="image" />
        <input type="submit" value="Upload" />
    </form>
    
    <?php
    
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        // アップロードされたファイルを取得
        $file = $_FILES['image'];
    
        // ファイル名、タイプ、データを取得
        $fileName = $file['name'];
        $fileType = $file['type'];
        $fileData = file_get_contents($file['tmp_name']);
    
        // データベースに接続
        $db = new mysqli('localhost', 'username', 'password', 'database');
    
        // 画像データを挿入するSQLクエリ
        $sql = "INSERT INTO images (name, type, data) VALUES (?, ?, ?)";
    
        // プレースホルダに値をバインド
        $stmt = $db->prepare($sql);
        $stmt->bind_param('ssb', $fileName, $fileType, $fileData);
    
        // クエリを実行
        $stmt->execute();
    
        // エラーが発生した場合は処理
        if ($db->error) {
            echo "Error: " . $db->error;
        } else {
            echo "Image uploaded successfully!";
        }
    
        // データベース接続を閉じる
        $db->close();
    }
    
    ?>
    
  3. 画像の取得

    画像をデータベースから取得するには、以下のPHPスクリプトを使用します。このスクリプトは、image_idパラメータを使用して、imagesテーブルから特定の画像を取得します。

    <?php
    
    // データベースに接続
    $db = new mysqli('localhost', 'username', 'password', 'database');
    
    // 画像IDを取得
    $imageId = $_GET['image_id'];
    
    // 画像データを取得するSQLクエリ
    $sql = "SELECT name, type, data FROM images WHERE id = ?";
    
    // プレースホルダに値をバインド
    $stmt = $db->prepare($sql);
    $stmt->bind_param('i', $imageId);
    
    // クエリを実行
    $stmt->execute();
    
    // 結果セットを取得
    $stmt->bind_result($fileName, $fileType, $imageData);
    $stmt->fetch();
    
    // ヘッダーを設定
    header('Content-type: ' . $fileType);
    
    // バイナリデータを出力
    echo $imageData;
    
    // データベース接続を閉じる
    $db->close();
    
    ?>
    
  4. 画像の表示

    データベースから取得した画像を表示するには、以下のHTMLコードを使用します。

    <img src="image.php?image_id=123" alt="Image">
    

    このコードは、image.phpスクリプトにimage_idパラメータを渡して、画像ID 123に関連する画像を取得します。

補足

  • 画像をアップロードする前に、ファイルサイズや拡張子の制限



画像のアップロード

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>画像アップロード</title>
</head>
<body>
    <h1>画像アップロード</h1>

    <form action="upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="image" />
        <input type="submit" value="アップロード" />
    </form>
</body>
</html>
<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // アップロードされたファイルを取得
    $file = $_FILES['image'];

    // ファイル名、タイプ、データを取得
    $fileName = $file['name'];
    $fileType = $file['type'];
    $fileData = file_get_contents($file['tmp_name']);

    // 許可されている拡張子をチェック
    $allowedExtensions = array('jpg', 'jpeg', 'png', 'gif');
    $fileExtension = pathinfo($fileName, PATHINFO_EXTENSION);
    if (!in_array($fileExtension, $allowedExtensions)) {
        echo "エラー: 許可されていないファイル形式です。";
        exit;
    }

    // ファイルサイズをチェック
    $maxFileSize = 5 * 1024 * 1024; // 5MB
    if ($file['size'] > $maxFileSize) {
        echo "エラー: ファイルサイズが大きすぎます。";
        exit;
    }

    // データベースに接続
    $db = new mysqli('localhost', 'username', 'password', 'database');

    // 画像データを挿入するSQLクエリ
    $sql = "INSERT INTO images (name, type, data) VALUES (?, ?, ?)";

    // プレースホルダに値をバインド
    $stmt = $db->prepare($sql);
    $stmt->bind_param('ssb', $fileName, $fileType, $fileData);

    // クエリを実行
    $stmt->execute();

    // エラーが発生した場合は処理
    if ($db->error) {
        echo "Error: " . $db->error;
    } else {
        echo "画像をアップロードしました!";
    }

    // データベース接続を閉じる
    $db->close();
}

?>

画像の取得

<?php

// データベースに接続
$db = new mysqli('localhost', 'username', 'password', 'database');

// 画像IDを取得
$imageId = $_GET['image_id'];

// 画像データを取得するSQLクエリ
$sql = "SELECT name, type, data FROM images WHERE id = ?";

// プレースホルダに値をバインド
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $imageId);

// クエリを実行
$stmt->execute();

// 結果セットを取得
$stmt->bind_result($fileName, $fileType, $imageData);
$stmt->fetch();

// ヘッダーを設定
header('Content-type: ' . $fileType);

// バイナリデータを出力
echo $imageData;

// データベース接続を閉じる
$db->close();

?>

画像の表示

<img src="image.php?image_id=123" alt="画像">

注:

  • このコードはあくまで例であり、実際のアプリケーションでは、エラー処理やセキュリティ対策を強化する必要があります。
  • 画像のアップロード処理では、ファイルサイズや拡張子の制限、不正なファイルのアップロード防止などの対策を講



その他の画像の格納・取得方法

BLOB形式ではなくファイルシステムに画像を保存

この方法では、画像データをBLOB形式でデータベースに格納する代わりに、ファイルシステムに保存し、データベースには画像ファイルのパスのみを格納します。

利点:

  • データベースの負荷を軽減
  • 大容量の画像を効率的に扱うことができる
  • ファイルシステムの管理が必要
  • 画像ファイルのパスを適切に管理する必要がある

実装方法

  1. 画像ファイルをアップロードされたら、ユニークなファイル名でファイルシステムに保存します。
  2. データベースに、画像ファイルのパス、ファイル名、その他の関連情報を格納します。
  3. 画像を表示するには、データベースから画像ファイルのパスを取得し、そのパスを使用してブラウザに画像を表示します。

例:

<?php

// 画像ファイルをアップロード
$fileName = uniqid() . '.jpg';
$fileTmpName = $_FILES['image']['tmp_name'];
move_uploaded_file($fileTmpName, 'images/' . $fileName);

// データベースに情報を格納
$db = new mysqli('localhost', 'username', 'password', 'database');
$sql = "INSERT INTO images (name, path) VALUES (?, ?)";
$stmt = $db->prepare($sql);
$stmt->bind_param('ss', $fileName, 'images/' . $fileName);
$stmt->execute();
$db->close();

?>
<img src="image.php?image_id=123" alt="画像">
<?php

// データベースから画像情報取得
$db = new mysqli('localhost', 'username', 'password', 'database');
$imageId = $_GET['image_id'];
$sql = "SELECT path FROM images WHERE id = ?";
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $imageId);
$stmt->execute();
$stmt->bind_result($imagePath);
$stmt->fetch();
$db->close();

// 画像を表示
header('Content-type: image/jpeg');
readfile($imagePath);

?>

Base64エンコーディングを使用して画像データを格納

この方法では、画像データをBase64エンコーディングして、データベースに格納します。Base64エンコーディングは、バイナリデータをテキストに変換する方法です。

  • 画像データをコンパクトに保存できる
  • 1つのSQLクエリで画像データを保存・取得できる
  • デコード処理が必要
  • データベースの容量によっては非効率になる可能性がある
  1. 画像ファイルをBase64エンコーディングします。
  2. Base64エンコードされたデータをデータベースに格納します。
  3. 画像を表示するには、データベースからBase64エンコードされたデータを取得し、Base64デコードしてからブラウザに表示します。
<?php

// 画像ファイルをBase64エンコーディング
$fileData = file_get_contents('image.jpg');
$base64ImageData = base64_encode($fileData);

// データベースに情報を格納
$db = new mysqli('localhost', 'username', 'password', 'database');
$sql = "INSERT INTO images (data) VALUES (?)";
$stmt = $db->prepare($sql);
$stmt->bind_param('s', $base64ImageData);
$stmt->execute();
$db->close();

?>
<img src="image.php?image_id=123" alt="画像">
<?php

// データベースから画像情報取得
$db = new mysqli('localhost', 'username', 'password', 'database');
$imageId = $_GET['image_id'];
$sql = "SELECT data FROM images WHERE id = ?";
$stmt = $db->prepare($sql);
$stmt->bind_param('i', $imageId);
$stmt->execute();
$stmt->bind_result($base64ImageData);
$stmt->fetch();
$db->close();

// Base64デコードして画像を表示
$imageData = base64_decode($base64ImageData);
header('Content-type: image/jpeg');
echo $imageData;

?>

php mysql database


VB6でSQLiteデータベース:パフォーマンス向上のためのヒント

SQLite を VB6 で使用するには、以下の手順が必要です。SQLite ライブラリを VB6 プロジェクトに追加 ダウンロードした SQLite ライブラリ (sqlite3. dll) を、VB6 プロジェクトフォルダにコピーします。 VB6 プロジェクトを開き、プロジェクト > 参照設定 を選択します。...


MySQL: INSERT ... ON DUPLICATE KEY UPDATE とトリガーによる行のコピー

MySQLで同じテーブルに1行をコピーし、自動増分フィールドに新しい値を挿入するには、いくつかの方法があります。方法INSERT INTO . .. SELECT . .. を使用これは、最もシンプルで汎用性の高い方法です。 以下の構文を使用します。...


SQL SQL SQL SQL Amazon で見る



徹底解説!画像をデータベースに保存するべき? Yea or Nay ?

データベースに画像を保存するかどうかは、プログラミングでよく議論されるトピックです。それぞれの方法にはメリットとデメリットがあり、最適な方法はプロジェクトの要件によって異なります。データベースに画像を保存するメリットデータの一貫性と整合性: 画像と関連データを同じ場所で管理できます。