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に画像を保存することができました。






