MySQLにバイナリで格納されたデータを画像(ID名.jpeg)で表示させる

データベース(MySQL)に格納されたバイナリデータを画像ファイル(.jpeg)として出力し表示させる仕組みをPHPで作ります。
PHPは勉強中のため、効率的な方法かどうかは微妙ですが、自力で方法を探し達成した方法なので忘れないように記録します。
達者な方からの改善コメントをお待ちしてます。

データベーステーブル例

id data update
WZaTlwQhnt4fUfm [BLOB – 2.3 MiB] 2009-04-20 20:07:54
BMJWn9a2ak3GGAf1 [BLOB – 4.0 MiB] 2009-04-20 20:07:54
oZqqwIiFmONHh5 [BLOB – 2.5 MiB] 2009-04-20 20:07:54

picture_list.php

データベースにある全ての画像ファイルの一覧を作成して画像ファイルにリンクします。


<html>
<head><title>写真表示</title></head>
<body>
<h1>写真表示</h1>

<?php
//MySQLに接続
$dbc=mysql_connect("localhost","user(ユーザー名)","123456(パスワード)") or die("MySQL接続失敗 :".mysql_error());

//データベースに接続
mysql_select_db("photo(データベース名)");

//「li_image」というテーブルの、ID選択する
$sql="SELECT id FROM li_image";
$res=mysql_query($sql,$dbc);

取得した配列を表示する
while($dat=mysql_fetch_array($res,MYSQL_NUM)){

//動的URLでアクセスする場合
//	print '<a href="picture_view.php?id='.$dat[0].'">';

//.htaccessで静的URLにリネームされたURLにアクセスする場合
	print '<a href="'.$dat[0].'.jpeg">';
	print $dat[0] ." の画像";
	print '</a><br />' ;

}
mysql_free_result($res);
?>

</body>
</html>

picture_view.php

次に上記で作成したpicture_list.phpからリンクされた際に
http://localhost/picture_view.php?id=WZaTlwQhnt4fUfm
というようなid付きURLでアクセスするとidの画像が表示されるプログラムです。


<?php
//Content-Typeを指定
header("Content-Type: image/jpeg");

//MySQLに接続
$db  = mysql_connect( 'localhost'  , 'user(ユーザー名)' , '123456(パスワード)' );

//データベースに接続
$dbh = mysql_selectdb( 'photo(データベース名)' ,$db );

//「li_image」というテーブルの、指定されたIDのレコードを選択する
$sth  = mysql_query ( "SELECT * FROM li_image WHERE id='{$_REQUEST['id']}'", $db );

//2 番目のパラメータを MYSQL_ASSOC に指定してコールする
$result = mysql_fetch_assoc( $sth );
print $result['data'];
?>

.htaccessで動的ページを静的ページとして表示させる

「http://localhost/picture_view.php?id=WZaTlwQhnt4fUfm」などの動的なURLを「http://localhost/WZaTlwQhnt4fUfm.jpeg」でアクセスできるようにします。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.jpeg$ picture_view.php?id=$1 [L]

1行目は、書き換え機能をONという意味。
2行目~3行目は、実際にリクエストされたディレクトリやファイルが存在すれば書き換えは実行しないという意味。
4行目は、正規表現で書かれた書き換え規則です。