画像アップロード時にファイル名をデータベースに保存する (PHP & MySQL)

2024-04-03

画像アップロード時にファイル名をデータベースに保存する (PHP & MySQL)

必要なもの:

  • PHP 5.6以上
  • MySQLデータベース
  • 画像ファイル

手順:

データベーステーブルの作成:

以下のSQLクエリを使用して、データベースに images というテーブルを作成します。

CREATE TABLE images (
  id INT AUTO_INCREMENT PRIMARY KEY,
  filename VARCHAR(255) NOT NULL,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

HTMLフォームの作成:

以下のHTMLコードを使用して、画像アップロードフォームを作成します。

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

PHPスクリプトの作成:

以下のPHPスクリプトを使用して、画像をアップロードし、ファイル名とその他の情報をデータベースに保存します。

<?php

// ファイルアップロード処理
if (isset($_FILES['image'])) {
  $errors = array();

  // ファイル名を取得
  $filename = $_FILES['image']['name'];

  // ファイルサイズチェック
  if ($_FILES['image']['size'] > 2097152) {
    $errors[] = 'ファイルサイズが大きすぎます。';
  }

  // MIMEタイプチェック
  if (!getimagesize($_FILES['image']['tmp_name'])) {
    $errors[] = 'ファイル形式が不正です。';
  }

  // エラーがない場合はファイルを保存
  if (empty($errors)) {
    // ファイル名をユニークにする
    $filename = uniqid() . '_' . $filename;

    // ファイルを保存
    move_uploaded_file($_FILES['image']['tmp_name'], 'uploads/' . $filename);

    // データベースに保存
    $db = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
    $stmt = $db->prepare('INSERT INTO images (filename, title, description) VALUES (?, ?, ?)');
    $stmt->execute([$filename, $_POST['title'], $_POST['description']]);

    echo 'アップロードが完了しました。';
  } else {
    // エラーメッセージを表示
    foreach ($errors as $error) {
      echo $error . '<br>';
    }
  }
}

?>

動作確認:

  1. 作成したHTMLファイルをブラウザで開きます。
  2. 画像ファイルを選択し、タイトルと説明を入力します。
  3. "アップロード"ボタンをクリックします。
  4. アップロードが成功すると、メッセージが表示されます。

補足:

  • このコードは基本的な例です。必要に応じてセキュリティ対策やエラー処理などを追加してください。
  • 画像の保存場所は適宜変更してください。
  • データベース接続情報は環境に合わせて変更してください。
  • 画像のサムネイルを作成する
  • 画像をカテゴリ別に分類する
  • 画像にタグを付ける



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

PHP:

<?php

// ファイルアップロード処理
if (isset($_FILES['image'])) {
  $errors = array();

  // ファイル名を取得
  $filename = $_FILES['image']['name'];

  // ファイルサイズチェック
  if ($_FILES['image']['size'] > 2097152) {
    $errors[] = 'ファイルサイズが大きすぎます。';
  }

  // MIMEタイプチェック
  if (!getimagesize($_FILES['image']['tmp_name'])) {
    $errors[] = 'ファイル形式が不正です。';
  }

  // エラーがない場合はファイルを保存
  if (empty($errors)) {
    // ファイル名をユニークにする
    $filename = uniqid() . '_' . $filename;

    // ファイルを保存
    move_uploaded_file($_FILES['image']['tmp_name'], 'uploads/' . $filename);

    // データベースに接続
    $db = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');

    // データベースに保存
    $stmt = $db->prepare('INSERT INTO images (filename, title, description) VALUES (?, ?, ?)');
    $stmt->execute([$filename, $_POST['title'], $_POST['description']]);

    echo 'アップロードが完了しました。';
  } else {
    // エラーメッセージを表示
    foreach ($errors as $error) {
      echo $error . '<br>';
    }
  }
}

?>

SQL:

CREATE TABLE images (
  id INT AUTO_INCREMENT PRIMARY KEY,
  filename VARCHAR(255) NOT NULL,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

説明:

  1. HTML: 画像アップロードフォーム
  2. PHP:
    • ファイルアップロード処理
    • ファイル名の取得
    • ファイルサイズチェック
    • MIMEタイプチェック
    • ファイル保存
    • データベース接続
    • データベースへの保存
    • エラー処理
  3. SQL: データベーステーブル

注意事項:




画像アップロード時にファイル名をデータベースに保存する他の方法

  • ファイル名にランダムな文字列を付与することで、ファイル名をユニークにすることができます。
  • 例: md5($filename) . '_' . $filename

ファイル名を暗号化する

  • ファイル名を暗号化することで、セキュリティを向上させることができます。
  • 例: openssl_encrypt($filename, $cipher, $key)

ファイル名をデータベースに保存しない

  • ファイル名をデータベースに保存せず、ファイルパスのみを保存する方法もあります。
  • この方法では、ファイル名の重複を気にしなくて済みます。

クラウドストレージサービスを利用する

  • Amazon S3 や Google Cloud Storage などのクラウドストレージサービスを利用することで、ファイルの保存と管理を簡単に行うことができます。

方法の選択

上記の方法はそれぞれメリットとデメリットがあります。

  • ファイル名の重複を防ぎたい場合は、ファイル名をハッシュ化または暗号化する必要があります。
  • セキュリティを重視する場合は、ファイル名を暗号化するか、クラウドストレージサービスを利用する必要があります。
  • ファイル名の検索機能が必要な場合は、ファイル名をデータベースに保存する必要があります。

php mysql database


MySQLデータベースのすべてのテーブルを1つのコマンドで切り捨てるその他の方法

構文例上記のコマンドは、users、orders、productsテーブルのデータをすべて削除します。TRUNCATEとDELETEの違いTRUNCATEとDELETEはどちらもデータを削除するコマンドですが、いくつかの違いがあります。TRUNCATEは、テーブルのデータをすべて即座に削除します。DELETEは、WHERE句によって指定された条件に一致するデータのみを削除します。...


SQLiteでインデックスを使いこなす! 作成・削除方法とパフォーマンスへの影響を徹底解説

データベースインデックスは、特定の列にアクセスする際のクエリのパフォーマンスを向上させるために使用されるデータ構造です。インデックスは、テーブル内のデータの論理的な順序とは異なる順序でデータを格納することにより機能します。これにより、クエリエンジンは、テーブル全体をスキャンするのではなく、インデックスを使用して必要なデータに直接アクセスできるようになります。...


MySQL、MongoDB、NoSQLデータベース:財務データ管理におけるそれぞれの役割

スキーマレスな財務データ とは、あらかじめ定義された構造を持たない財務データのことです。これは、従来の SQL データベース で使用される 構造化データ とは対照的です。構造化データは、行と列で組織され、各列には特定のデータ型が割り当てられます。...


SQL初心者でも安心!ステップバイステップでわかるWHERE句の多重条件検索

構文説明SELECT 句:抽出したい列を指定します。FROM 句:検索対象のテーブルを指定します。WHERE 句:レコードを絞り込む条件を指定します。AND キーワード:複数の条件を組み合わせるために使用します。例社員テーブル (employees) において、部署が「営業」で、かつ入社年が2020年以降の社員をすべて抽出するクエリは以下のようになります。...


MariaDB 初心者向け!Mac Big Sur で MariaDB をインストール・設定する方法

原因: この問題は、Homebrew でインストールされた以前のバージョンの MySQL と MariaDB の競合が原因である可能性があります。解決策: 以下の手順で問題を解決できます。古い MySQL インストールを削除する:MariaDB を再インストールする:...