※ ChatGPTを利用し、要約された質問です(原文:PHP・MySQLでの画像(BLOB型)表示方法)
PHP・MySQLでの画像表示方法と管理方法
このQ&Aのポイント
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つのファイルにまとめて、使い回しの効くファイルを制作することはできないでしょうか?
改善方法や、このような場合のオススメな方法がありましたら教えていただきたく思います。
お礼
早急なご回答、誠にありがとうございます。
補足
早急なご回答、誠にありがとうございます。 大変感謝しております。 おっしゃる通り、DBにデータを直接保存する理由は見当たりませんでした。。。 ディレクトリに使い回す画像を格納(ディレクトリに登録)しておいて(huri_0.jpg等)、 商品の画像やその他情報(商品案内文等)をアップロードファイルで 都度登録し、ディレクトリに登録した使い回す画像はラジオボタンで OK=0やNG=1 と設定しアップロードするということで、お教えいただいた <img src="ファイルパス/<?php echo $table["name"]); ?>_huri_<?php echo $table["hurikomi"]?>.jpg" /> を表示ファイルに組み込めば、実装できそうな気がしてきました。 ここで、お恥ずかしいご質問なのですが、私のしたい事としまして、 最終的にはフリーワード等での検索や商品ごとの比較をできる様にと 考えています。 そうであれ、使い回す画像はディレクトリでも問題ないと思うのですが、 画像を登録する際に、DBに直接登録する方法とディレクトリに登録する方法とでの 違いやメリット・デメリットはあるのでしょうか? また、検索や比較を行う上での特段しなければならない事をご存知でしたら 教えていただきたく思います。 再度のご質問となり、申し訳ございませんが、お気が向きましたら ご回答お願いいたします。