Table of Contents
PHPから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 は画像をデータベースに送信します。その際、画像にキーとなる任意の名前をつけて保存することができます。
画面には、送信する画像と名前をつけるためのテキストフィールドがあります。
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の方も確認してみると、以下のようにデータが保存されていることが確認できます。
以上でPHPからMySQLに画像を保存することができました。