MySQLのblob型の画像表示について

このQ&Aのポイント
  • MySQLのblob型を使用して画像をテーブルから取得し、phpで表示させる方法について調べています。
  • jpg画像は表示できましたが、gif画像とpng画像は表示できないです。
  • また、一つのphpファイルで複数の画像と文章を表示させることはできないようです。
回答を見る
  • ベストアンサー

mysqlのblob型の画像表示について

テーブルの項目にblob型を作成し、 phpでテーブルから取得した画像を画面に表示させたいのですが、 以下のように表示させることは可能でしょうか? test.php ---------- ここから画面 ---------------------------------------- 取得したblob型の画像その1.jpg 取得したblob型の画像その2.gif 取得したblob型の画像その3.png それぞれの画像の説明 ---------- ここまで画面 ---------------------------------------- テーブルへのデータ挿入はphpMyAdminから挿入しています。 header('Content-type: image/jpeg'); echo SQLで取得した値; のようにすればjpg画像は表示できましたが、gif画像とpng画像は表示できませんでした。 また、jpg画像のみを表示させることは出来ましたが文章を表示させることはできませんでした。 上記のように一つのphpファイルで複数表示させるのはできないのでしょうか?

  • PHP
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

はい。どんな言語をもってしても不可能です。HTTPの仕様ですのでどうしようもないです。

green64
質問者

補足

仕様であれば仕方ないですね。 回答ありがとうございます。

その他の回答 (1)

noname#244856
noname#244856
回答No.1

この方法は、PHPファイルを画像ファイルのように見せかける方法ですね。この方法では1つの画像しか扱えません。複数ファイルを扱いたいのであれば、 <img src="img.php?id=xxx" /> <img src="img.php?id=yyy" /> <img src="img.php?id=zzz" /> のようにして画像のバイナリデータ自体を出力するPHPファイルをIMG要素としてHTML内に埋め込む必要があります。ただ毎回PHP処理を呼ばれるとサーバーに負荷がかかるので、キャッシュを有効にしておくといいかも。 Qiita - PHPから画像を送信する際にキャッシュを有効にしておく http://qiita.com/takuya_1st/items/938139ba8f20a71f8915 関連↓ Qiita - PHPでデータベースに接続するときのまとめ http://qiita.com/mpyw/items/b00b72c5c95aac573b71

green64
質問者

補足

つまり、test.phpに <img src="img.php?id=xxx" /> <img src="img.php?id=yyy" /> <img src="img.php?id=zzz" /> を埋め込み、 img.phpで分岐処理を行い、それぞれの画像を表示させるということですね? そういないと表示できないということですか。 test.phpのみで表示できないということですか。

関連するQ&A

  • MySQLのBLOBにバイナリで格納した画像を表示

    現在PHPを勉強しはじめた初心者です。今 MYSQLのデータベースを利用してUPLOADした画像を表示させたいと思っております。 そこでMYSQLのBLOBに画像を保存出来まではできたのですが、 そこから表示させる方法がどうしても分かりません。。 こちらが今やっていますスクリプトになります。 <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8”> <title>画像表示</title> </head> <body> <p>MySQLのBLOBにバイナリで格納した画像を表示してみます。 </p> <?php echo <img src=”image_display.php?id=1”> ?> <?php $conn=mysql_connect('localhost','aaa','pass'); // DB選択 mysql_select_db(”alpha”); // SQL問合せ // このphpを呼び出す際、idを指定 $sql = select * from beta where(id=$_GET[id]); $result = mysql_query($sql); // 問合せ結果を配列にセット $row = mysql_fetch_array($result); echo $row[1]; // テーブルの2列目のカラムを取得 ?> </body> </html> 自分ではいったいなにが悪いのか分かりません。 どのたかお分かりになるかたいましたらご教授していただけませんでしょうか。 お願いします。

  • 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つのファイルにまとめて、使い回しの効くファイルを制作することはできないでしょうか? 改善方法や、このような場合のオススメな方法がありましたら教えていただきたく思います。

    • ベストアンサー
    • PHP
  • mysqlに保存した画像を表示したい

    フォームからmysqlに画像(jpg形式)を保存しました。 カラム名はmain_imgでblob型です。 流れとしては 1:入力フォーム // イメージ取得 $image = file_get_contents($_FILES['image']['tmp_name']); // 取得したイメージをセッションに代入 $_SESSION['regist']['image'] = $image; 2:確認ページ 特になにもせず 3:登録完了ページ $_SESSION['regist']['image']をmysql_real_escape_stringし 変数名を$imageに変更。 カラム名main_imgに$imageをINSERT この段階でphpmyadminを見るとカラム名main_imgには [BLOB - 4.3 KiB]となっております。 次にmysqlに保存した画像を表示させたいと思い ---view.php--- $res =& $mdb2->query('SELECT * FROM products'); while ($row = $res->fetchRow()) { $img_list['main_img'] = $row['main_img']; } $mdb2->disconnect(); header('Content-type: image/jpeg'); echo $img_list['main_img']; ---view.html--- <img src="view.php?id=2" /> としたのですがなぜか画像が表示されません。 header('Content-type: image/jpeg');をコメントアウトすると 意味不明な文字列?が表示されます。 view.phpにアクセスするとhttp://~~/view.phpとurlが 画像として表示されFireFoxでブラウザを更新すると一瞬だけ 『画像ファイル "http://~~/view.php" は壊れているため、表示できませんでした。』 と表示されます。 ie,safariでも試しましたが画像は表示されませんでした。 調べてみたのですが同じような事例がみつからなかったのですが 解決するにはどうすればいいものでしょうか?

    • ベストアンサー
    • PHP
  • BLOBデーターの画像の表示方法を教えてください。

    php(4.3)とmysql(4.0)を使って、BLOBに格納した画像を表示させたいです。 テーブル:gazou 画像名:aa.gif | id |   images    | | ̄ ̄| ̄ ̄ ̄ ̄ ̄ ̄ ̄| ̄ ̄ | 1 | [BLOB-2.9KB] | ↑ PHPMYADMINでデーターを作って、画面にはこのように表示されています。 <html> <head> <meta http-equiv=”Content-Type” content=”text/html; charset=EUC-JP”> </head> <body> <?php $conn = mysql_connect("localhost","user","pass"); mysql_select_db(test); $self = basename($_SERVER['PHP_SELF']); $sql = " SELECT * FROM gazou "; $rst = mysql_query($sql,$conn); while($row=mysql_fetch_array($rst)){ print"<img src='{$self}?id=$row[id]'>"; } ?> </body> </html> 本やネットで自分なりに調べた結果、これで画像が表示されるはず(!?)だと思っているのですが、残念ながら、画像は×になって表示されません。 初歩的な質問ですみませんが、どうすれば画像は表示されるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 画像表示で不正な理由がわからない

    お世話になります。 PHP4とMySQLを使って 「DBのBLOB型項目に保存した画像データを呼び出して表示する」 ということがしたくてこちらも他もいろいろ調べた結果、 「画像表示PHP」のimgのsrc部で「画像呼出PHP」を指定すればよい というのはわかったのですが、うまくいきませんでした。 それで少しずつ決め打ちを増やしたり削ったりして簡素化し不正な点を見つけようとしたのですが直らず、最終的に下のようにDBからの読み出しすらやめて、「同一階層にイメージを置いて表示するだけ」としてもエラーが直らないのでわけがわからなくなってしまいました。 そもそもやってること自体が少ないので根本的な勘違いなのかもしれませんが、どなたか気づいた方教えて頂けないでしょうか? どうかよろしくお願い致します。 ----------------------------------------------- ■画像表示「test.php」 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>TEST</title> </head> <body> <? echo "<img src=\"image.php\">"; ?> </body> </html> ----------------------------------------------- ■画像呼出「image.php」 <? header("Content-Type; image/jpeg"); echo "aaa.jpg"; ?> ----------------------------------------------- ・「test.php」「image.php」「aaa.jpg」はすべて同一ディレクトリ ・test.phpのPHP部を「<img src="aaa.jpg">」とすると正常に表示 ・エラー状態とは画面に「×」画像が表示される状態

    • ベストアンサー
    • PHP
  • MYSQLから画像を取り出したい

    PHPとMYSQLにて画像を表示したいのですが、 PHPmyadminにてBLOB型にJPG画像を手動で 入れて有ります、そこで下記のように取り出そうとしたのですが、文字の羅列が長く表示され、画像はでません。 $result = mysql_query("SELECT * FROM test"); $row = mysql_fetch_assoc($result); print ($row['image']); 文字の羅列が出るので、データははいっているとおもうのですが、取り出し方が悪いのでしょうか?

    • ベストアンサー
    • PHP
  • PHP + MySQL で画像データ表示

    PHP5 + MySQLでホームページを作成しております。 画像をバイナリデータでDBに登録するとことまではできたのですが、その画像データをどうやってテンプレートに表示させるかがよく分からず、質問させていただきます。 環境は下記の通りです。 ======================= サーバ:CentOS5.4(i386版) ※Apache、PHP5、MySQL、phpMyAdminはインストール済み 使用言語XHTML、CSS、JavaScript、PHP、MySQL(それぞれ別ファイルで作成しております) ======================= 現在までできている内容としては、 テンプレートのフォーム <input type="file" name="upload_img"></input> から画像を選択して、PHP側で$_FILEで受け取った後に 画像専用のテーブル カラム名:USER_IMG データ型:MIDIUMBLOB に受け取った画像のバイナリデータをinsertするところまでです。 この後に、そのバイナリデータをテンプレート上に表示させたいのですが、その方法がよく分かりません。 この質問をする事前に、参考になりそうなサイトをいくつか調べていて、 ・テーブルには画像以外にMIMEタイプを入れるカラムを用意して、MIMEタイプをもとにheaderのContent-typeを指定する ・Content-type: text/html; でも一応画像を表示させることはできる ということは分かりました。 ですが、今作っているテーブルにinsertした画像を表示させるhtmlは Content-type: text/html で作成しており、そのテンプレート内に <img src="画像パス/画像名.gif"></img> といった形で表示させたい場合に、画像のパスはどうやって指定してあげたらよいのか分かりません。 また、そのページのContent-typeは Content-type: text/html ではなく、MIMEタイプから対応したContent-typeにした方が良いのでしょうか? お分かりになる方いらっしゃいましたら、ご教授のほどお願い致します。

    • ベストアンサー
    • PHP
  • PHP 登録フォームの確認画面で画像を表示したい

    こんにちは。いつもお世話になっております。 PHPを勉強し始めたばかりのものです。 登録フォームから送った画像を、確認ページでプレビュー表示させたいです。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12141865207 の質問に辿り着きましたが、実装できませんでした。 3点質問があります。 1、sessionを使わず、$_FILESで実装することが可能なのでしょうか? 2、$_FILESから画像を表示させようとして失敗しています。一時保存場所に画像があると思うのですが、 $photo = $_FILES['UseImg']['tmp_name'] <img src ="<?php echo $photo; ?>"> これでは画像表示ができませんでした。$_FILESに関して根本的な考え違いをしているのだと思うのですが、これはどうしてなのでしょうか? 3、img要素にPHPを挿入することは可能なのでしょうか? 可能だとしたら、何故、以下の方法で動かないのでしょうか。 file.php <form enctype="multipart/form-data" action = "file2.php" method = "post" > <input type="file" name="UseImg"> <input type="submit" name="FILE送信" value="FILE送信"> </form> file2.php <?php session_start(); $_SESSION['UseImg']['type'] = exif_imagetype($_FILES['UseImg']['tmp_name']); $_SESSION['UseImg']['data'] = file_get_contents($_FILES['UseImg']['tmp_name']); echo '<img src="UseImg.php" />'; UseImg.php <?php session_start(); if (!isset($_SESSION['UseImg'])) { die('abort'); } switch ($_SESSION['UseImg']['type']) { case IMAGETYPE_JPEG: header('content-type: image/jpeg'); break case IMAGETYPE_PNG: header('content-type: image/png'); break case IMAGETYPE_GIF: header('content-type: image/gif'); break } echo $_SESSION['UseImg']['data'] 持っているPHPの本では確認画面を通さずに画像をアップロードしており、プレビューに関しては見当たりません。 いつも質問ばかりで申し訳ありませんが、この度も、宜しくお願いします。

    • ベストアンサー
    • PHP
  • BLOBでの画像表示について

    BLOBでの画像表示について質問させてください。 元々ヘテムルのサーバーを利用していたのをここ最近さくらのVPSに移行しました。 するとヘテムルではBlob型の画像表示が正常に表示されていたものがサクラのVPSにて画像表示がされなくなってしまいました。 mysqlのバージョンやphpinfoの設定などを限りなくヘテムルに近づけたのですが正常に表示されないため詰まってしまいました。 各ブラウザで、以下のような状況です。 IE:表示されない Chrome:表示されない Firefox:画像ファイル"http://~/image.php?id=544"は壊れているため、表示できませんでした。 以下質問用にソースを書き換えたものですが、ご教授頂ければと思います。 質問用ソースで動作させて同じ様に画像が出ないことは確認しています。 質問用ソースの構造は以下の通りです。 form.html ↓ファイルをPOST upload.php ↓データをINSERT MySQLのthumbnailテーブル ↓データをSELECT image.php ■form.html■ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> ファイル:<br /> <input type="file" name="upfile" size="30" /><br /> <br /> <input type="submit" value="アップロード" /> </form> </body> </html> ■upload.php■ <?php include_once(dirname(__FILE__) . "/admin/common/functions.php"); include_once(dirname(__FILE__) . "/admin/common/db_functions.php"); // MySQL に接続し、データベースを選択します。 dbConnect(); global $_G_DbConnection; $message = "ファイルが選択されていません。"; //サムネイル1 if (is_uploaded_file($_FILES["upfile"]["tmp_name"]) && !empty($_FILES["upfile"]["name"])){ $contents = file_get_contents($_FILES["upfile"]["tmp_name"]); $contents = base64_encode($contents); $contents = mysql_real_escape_string($contents,$_G_DbConnection); $post_thumbnail1 = $contents; $post_thumbnail1_name = $_FILES["upfile"]["name"]; } mysql_query("SET AUTOCOMMIT=0"); mysql_query("BEGIN"); // サムネイル1 $post_thumbnail1_id = null; if (!empty($post_thumbnail1_name)) { $sql = "INSERT INTO `thumbnail` ("; $sql .= "`filename`,`thumbnail`)"; $sql .= " values('$post_thumbnail1_name', '{$post_thumbnail1}')"; if (!(mysql_query($sql))) { mysql_query("ROLLBACK"); $message = "ファイルをアップロードできません。"; } else { $post_thumbnail1_id = mysql_insert_id(); mysql_query("COMMIT"); $message = $post_thumbnail1_name . "をアップロードしました。"; } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>sample</title> </head> <body> <p><?=$message; ?></p> <img src="image.php?id=<?=$post_thumbnail1_id; ?>"> </body> </html> ■image.php■ <?php include_once(dirname(__FILE__) . "/admin/common/functions.php"); include_once(dirname(__FILE__) . "/admin/common/db_functions.php"); // MySQL に接続し、データベースを選択します。 dbConnect(); global $_G_DbConnection; //ID $get_id = null; if (isset($_GET['id'])){ $get_id = $_GET['id']; // MySQL 問い合わせテスト $sql = "select * from `thumbnail`"; $con = " where id = " . $get_id; if (!($rs = mysql_query($sql . $con))) { echo "MySQL 問い合わせエラー"; echo $sql . $con; die; } while ($row = mysql_fetch_array($rs)) { // 出力 $ext = substr($row['filename'], strrpos($row['filename'], '.') + 1); if (is_null(get_content_type($ext))) { echo "ファイル取得エラー"; } else { header('Content-type: ' .get_content_type($ext)); echo base64_decode($row['thumbnail']); } } dbFreeResult($rs); } ?> ■thumbnailテーブル■phpMyadminよりエクスポート CREATE TABLE IF NOT EXISTS `thumbnail` ( `id` int(11) NOT NULL AUTO_INCREMENT, `filename` varchar(255) DEFAULT NULL, `thumbnail` longblob NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=545 ; □中身のデータ□ INSERT INTO `thumbnail` (`id`, `filename`, `thumbnail`) VALUES (544, 'SH3D0054.jpg', 0x2f~2f5a);  ←[BLOB - 17.3 KiB] INSERT INTO `thumbnail` (`id`, `filename`, `thumbnail`) VALUES (543, 'ねむネコ.bmp', 0x51~413d); ← [BLOB - 234.9 KiB] 長くなってしまいましたが、ご教授お願い致します。

    • 締切済み
    • PHP
  • mysqlに保存した画像の表示がうまくいかない

    phpとmysqlで検索システムを作っています。 今回、mysqlにテキストデータと一緒に画像も保存し検索結果を表示する時に画像も一緒に表示されるようにしたいと考えています。 ひとまずテキストデータは問題なく保存、検索、表示ともに正常に動作していますが、画像がどうしてもうまく表示されません。 DB内を確認してみると、保存はきちんとされているようなのですが。 わかる方がいらっしゃいましたら、アドバイスをいただけないでしょうか? 以下にコードの内容を記載します。テキストデータは正常に動作するので、画像の表示に関する部分だけ記載させて頂きます。 ※検索結果の該当フィールドのidをキーとして渡して、該当するidの画像(DB内のimage1)を表示する。 よろしくお願いします。 【mysqlテーブル】 create table entries ( id int not null auto_increment primary key, name varchar(255), address varchar(255), image1 MEDIUMBLOB NOT NULL, image2 MEDIUMBLOB NOT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 【result.php】 //画像表示箇所 <?php echo '<img src="get_image.php?id=' . $row['id'] . '">' ?> 【get_image.php】 <?php $id = $_GET['id']; header('Content-Type: image/jpg'); echo $row['image1']; ?>

    • ベストアンサー
    • PHP