PHP・MySQLでの画像(BLOB型)表示方法
初めまして。PHP・MySQLの初心者で大変恐縮ではございますが、
お力を貸していただければ嬉しく思います。
現在、商品を紹介するシステムを制作しておりまして、
PHPを使ってMySQLに画像をBLOB型(mediumblob)で保存し、
単体表示するところまではできました。
しかし、私が実装したい事としまして、商品の一覧表示として
「商品のメイン画像」と
「商品の支払い方法をOKとNGで2つの画像を選択して表示」
(例えば、銀行振込OKという画像と銀行振込NGという画像をその商品によって使い分ける)
ような形でMySQLに登録し、表示したいと思っております。
そこで商品1つにつき、その都度「OK」「NG」の画像を登録してもよかったのですが、
リレーションを設定した方が効率がいいと思い、商品のメイン画像の含まれた紹介するメインテーブルと
支払い方法画像テーブルの2つをMySQLに登録しました。
【商品紹介メインテーブル】
テーブル名:lineup
id---- name -------main_images----------- mime------- ・・・
1 ---- item1 ---- [BLOB - ××KiB] ----- image/jpeg ---- ・・・
2 ---- item2 ---- [BLOB - ××KiB] ----- image/jpeg ---- ・・・
・・・ -- ginkouhurikomi_images ---- creditcard_images
・・・ ---------- hurikomiOK ---------------- creditcardOK
・・・ ---------- hurikomiNG ---------------- creditcardNG
【支払方法画像テーブル】
テーブル名:lineup_houhou
id--------- name --------- houhou_images ------- mime
1 ---- hurikomiOK------- [BLOB - ××KiB] ---- image/gif
2 ---- hurikomiNG------- [BLOB - ××KiB] ---- image/gif
3 ---- creditcardOK ---- [BLOB - ××KiB] ---- image/gif
4 ---- creditcardNG ---- [BLOB - ××KiB] ---- image/gif
ここで、lineup_houhouテーブルの「name」とlineupテーブルの「ginkouhurikomi_images」をリレーションし
lineup_houhouテーブルの「houhou_images」を呼び出す為に、下記記載のindex.phpファイルに
【(1)】
$recordSet = mysql_query ("SELECT m.houhou_images, i.* FROM lineup i, lineup_houhou m
WHERE i.ginkouhurikomi_images=m.name ORDER BY id DESC");
としました。
また、一覧表示をするファイルとして用意してあるのが
【index.php】
<?php
require ("dbconnect.php");
$recordSet = mysql_query ("SELECT m.houhou_images, i.* FROM lineup i, lineup_houhou m
WHERE i.ginkouhurikomi_images=m.name ORDER BY id DESC");
?>
<html>
<table>
<tr>
<th>ID</th>
<th>商品名</th>
<th>商品画像</th>
<th>銀行振込画像</th>
<th>クレジットカード支払画像</th>
</tr>
<?php
while ($table = mysql_fetch_assoc($recordSet)) {
?>
<tr>
<td><?php echo (htmlspecialchars($table["id"])); ?></td>
<td><?php echo (htmlspecialchars($table["name"])); ?></td>
<td><img src="view.php?id=<?php echo (htmlspecialchars($table["id"])); ?>" /></td>
<td><img src="view01.php?id=<?php echo (htmlspecialchars($table["houhou_images"])); ?>" /></td>
<td><img src="view02.php?id=<?php echo (htmlspecialchars($table["〇〇〇〇"])); ?>" /></td>
</tr>
<?php
}
?>
</table>
【view.php】
<?php
require ("../dbconnect.php");
$id = intval ($_GET["id"]);
$mime = null;
$sql = "SELECT main_images FROM lineup WHERE id = $id";
$result = mysql_query($sql);
if (!$result) {
echo ("SQLの実行に失敗しました");
echo (mysql_errno().": ".mysql_error());
exit;
}
if (mysql_num_rows($result) == 0) {
$sql = "SELECT main_images, mime FROM lineup WHERE id = 1";
$result = mysql_query($sql);
if (!$result) {
echo ("SQLの実行に失敗しました");
echo (mysql_errno().": ".mysql_error());
exit;
}
}
$row = mysql_fetch_row ($result);
$imgdat = base64_decode ($row[0]);
header ("Content-Type:".$mime);
echo $imgdat;
mysql_close ();
?>
【view01.php】
<?php
require ("../dbconnect.php");
$id = intval ($_GET["id"]);
$mime = null;
$sql = "SELECT houhou_images FROM lineup i, lineup_houhou m WHERE i.ginkouhurikomi_images=m.name";
$result = mysql_query($sql);
if (!$result) {
echo ("SQLの実行に失敗しました");
echo (mysql_errno().": ".mysql_error());
exit;
}
if (mysql_num_rows($result) == 0) {
$sql = "SELECT houhou_images, mime FROM lineup i, lineup_houhou m WHERE i.ginkouhurikomi_images=m.name";
$result = mysql_query($sql);
if (!$result) {
echo ("SQLの実行に失敗しました");
echo (mysql_errno().": ".mysql_error());
exit;
}
}
$row = mysql_fetch_row ($result);
$imgdat = base64_decode ($row[0]);
header ("Content-Type:".$mime);
echo $imgdat;
mysql_close ();
?>
ここで2つの質問があります。まずMySQLの管理方法です。
現状、呼び出すカラム名ごとでしか【(1)】のmysql_query文から画像ファイルを呼び出せない状況です。
自分で考えて、一度lineupテーブルの「ginkouhurikomi_images」と「creditcard_images」を1つにまとめて
「shiharai_images」を作成し、試してみましたが、力不足で上手く呼び出すことはできませんでした。
もう1つはview.phpの作成方法です。
こちらも同じく、呼び出すカラム名ごとに上記view.phpやview01.phpを作成している状況ですが、
上手に1つのファイルにまとめて、使い回しの効くファイルを制作することはできないでしょうか?
改善方法や、このような場合のオススメな方法がありましたら教えていただきたく思います。
お礼
おぉ!!バッチリ解決できました。 ありがとうございます(*´▽`*)