画像をMySQLに保存して取り出すPHPスクリプト

2016年10月6日(更新: 2016年10月6日)

MySQLのロゴ

PHPからMySQLに画像を保存・読み込みを行う簡単なプログラムの作り方です。

サンプルプログラムの詳解

データベースの設定

まず、画像を保存する先のMySQLに以下のようなテーブルを用意します。

MySQLのテーブル設定

以下のSQL文を実行すると作成できます。

CREATE TABLE `ImageData` (
  `name` varchar(20) NOT NULL,
  `image` blob NOT NULL,
  `extension` varchar(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

画像ファイルはバイナリデータBinary Large Object: BLOB)として保存します。

画像のMIMEタイプを読み込みの際に判別するため、画像の拡張子(extension)も一緒に保存します。

画像を送信するPHPスクリプト – save.php

save.php は画像をデータベースに送信します。その際、画像にキーとなる任意の名前をつけて保存することができます。

画面には、送信する画像と名前をつけるためのテキストフィールドがあります。

save.phpの画面

PHPスクリプトの中身

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>MySQLに画像を保存するサンプル</title>
</head>
<body>
  <img src="testImage.png" alt="保存する画像">

  <form action="save.php" method="post">
    <input type="text" name="imageName" placeholder="名前">
    <input type="submit" value="送信">
  </form>
</body>
</html>

<?php

// 送信ボタンが押されたら、入力を受け取ってデータベースに画像を送信
if (isset($_POST['imageName'])) {
  $name = $_POST['imageName'];
} else {
  echo '名前を入力して送信ボタンを押してください。';
  exit;
}

function getPDO() {
  // PHP Data Object を返す
  $dataSourceName = 'mysql:host=localhost;dbname=imagedb;charset=utf8';
  $user = 'root';
  $dbPassword = 'password';

  return new PDO($dataSourceName, $user, $dbPassword);
}

// 送信する画像の中身と拡張子を取得
$imagePath = "./testImage.png";
$image = file_get_contents($imagePath);
$extension = pathinfo($imagePath, PATHINFO_EXTENSION);

try {

  $pdo = getPDO();

  $tableName = "ImageData";

  $insert = $pdo->prepare('INSERT INTO ' . $tableName . ' (name, image, extension) VALUES (:name, :image, :extension)');
  $insert->bindValue(':name', $name, PDO::PARAM_STR);
  $insert->bindValue(':image', $image, PDO::PARAM_LOB);
  $insert->bindValue(':extension', $extension, PDO::PARAM_STR);
  $insert->execute();

  echo "登録完了: $name <br>";
  echo '<a href="load.php?name='.$name.'">送信した画像を確認する</a>';

} catch (Exception $e) {
  echo "insert failed: " . $e;
}
?>

画像を読み込むPHPスクリプト – load.php

load.php は、保存した画像の拡張子から適切なMIMEタイプを設定して画像を返します。MIMEタイプが header によって送信されるので、このスクリプト自体が画像となります。

前の画面でつけた画像の名前はGETで渡されます。

<?php

if (isset($_GET['name'])) {
  $name = $_GET['name'];
}

function getPDO() {
  // PHP Data Object を返す
  $dataSourceName = 'mysql:host=localhost;dbname=imagedb;charset=utf8';
  $user = 'root';
  $dbPassword = 'password';

  return new PDO($dataSourceName, $user, $dbPassword);
}

// 拡張子によってMIMEタイプを切り替えるための配列
$MIMETypes = array(
   'png'  => 'image/png',
   'jpg'  => 'image/jpeg',
   'jpeg' => 'image/jpeg',
   'gif'  => 'image/gif',
   'bmp'  => 'image/bmp',
);

try {

  $pdo = getPDO();

  $tableName = "ImageData";

  // データベースから条件に一致する行を取り出す
  $data = $pdo->query('SELECT * FROM ' . $tableName . ' WHERE name = "' . $name . '"')->fetch(PDO::FETCH_ASSOC);

  // 画像として扱うための設定
  header('Content-type: ' . $MIMETypes[$data['extension']]);

  echo $data['image'];

} catch (Exception $e) {
  echo "load failed: " . $e;
}
?>

サンプルの動作

例えば、WordPressのロゴ画像をMySQLに保存するとしましょう。画像の名前を「WordPress」とします。

データベースに画像を保存する例

送信ボタンを押すと画面が切り替わります。問題なく送信されていれば「送信完了」と表示されます。

データベースに画像を保存完了

「送信した画像を確認する」リンクをクリックすると、保存した画像が表示されます。MySQLの方も確認してみると、以下のようにデータが保存されていることが確認できます。

MySQLに保存された画像

以上でPHPからMySQLに画像を保存することができました。

コメントを残す

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