MySQLに保存した画像を表示する方法

このQ&Aのポイント
  • MySQLに保存した画像を表示する方法について教えてください。
  • 質問者はフォームから画像をMySQLに保存し、画像を表示させたいと考えています。
  • 質問者はview.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でも試しましたが画像は表示されませんでした。 調べてみたのですが同じような事例がみつからなかったのですが 解決するにはどうすればいいものでしょうか?

noname#65793
noname#65793
  • PHP
  • 回答数2
  • ありがとう数0

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

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

foreachループ内に if文で分岐させて、画像用だけescapeしないか、base64_encodeするか、とすればよいでしょう。 foreach ($_SESSION['regist'] as $s_key => $s_val) { if( $s_key != 'image' ){ $$s_key = mysql_real_escape_string($s_val); }else{ $$s_key = base64_encode($s_val); } } // base64_encode したなら、取り出し時に base64_decode すること

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

複数のことをが絡まっていそうなのでひとつひとつクリアして いってはいかがでしょうか? (1)insert時のアップロード処理 (2)アップロードにセッションを使う部分 (3)セッションにつかっている配列処理 (4)insert時のmysql_real_escape_string()の利用方法 (5)MySQLのデータ型の問題 (6)その他何らかの問題がありうまくデータが保存されていない (7)表示のデータ抽出方法の問題 (8)エスケープされた箇所が戻っていない (9)MIMEの問題 すべての部分があやしいのでなんともいえません。 可能性としてはエスケープ処理の問題がかなりあやしそうですが・・・。 画像以外のデータもつかって不正がないかデバッグしていくしかないでしょう。

noname#65793
質問者

補足

お返事ありがとうございます。 まる二日悩んでも解決せずで困っておりました...>< 引き続き試していたのですが結果として mysql_real_escape_stringをせずにinsertすると正常に画像が 表示するようになりました。 原因がなぜかはわかりませんが >(4)insert時のmysql_real_escape_string()の利用方法 が原因なようでした。 利用方法についてですがforeachで一括で変換しています。 foreach ($_SESSION['regist'] as $s_key => $s_val) { $$s_key = mysql_real_escape_string($_SESSION['regist']["$s_key"]); } 動作としましては例えば $_SESSION['regist']['hoge'] $_SESSION['regist']['hoge1'] とある場合 $hoge = mysql_real_escape_string($_SESSION['regist']['hoge']) $hoge1 = mysql_real_escape_string($_SESSION['regist']['hoge1']) となり$hoge,$hoge1をinsertしています。 mysql_real_escape_stringが鍵となっているようなのですが 外すわけにもいかず悩みどころです。

関連するQ&A

  • php,mysqlにて画像パス保存/表示につい

    mysqlに画像パスを格納しておき、phpでブラウザに表示するという部分について質問があります。 以前画像を扱った際は、DBにそのまま画像データを格納していたのですが、一般的ではないということで画像パス使う方針にしました。 画像パスはthumbnailというカラムにvarcharで画像パスを格納しました。 今回ご相談させていただいた件では、主に画像の表示の部分にアドバイスをいただければと考えています。 以前画像をそのまま保存し表示するときは、get_image.phpのようなファイルを噛ませ、それをブラウザに読み込ませることで表示していたのですが、画像パスでも同じようなやり方でいいのでしょうか? ネットで調べてみたのですが、何となくしっくりこないというか、私の誤解もあるかもしれないのですがすっきりせず迷走中です。 どうか、アドバイスをご教示いただけないでしょうか。 ※以下は、試しにget_image.php噛ませてみた際のコードです。 <?php $id = $_GET['id']; //DB接続 ~省略~ $sql = "SELECT image FROM テーブル名 WHERE id='$id'"; $result = mysql_query($sql); if (!$result) { echo ("SQLの実行に失敗しました<BR>"); echo(mysql_errno().": ".mysql_error()); exit; } $row = mysql_fetch_array($result); mysql_close($con); $img_path = '$row['image']' $img = file_get_contents($img_path); header('Content-type: image/jpg'); echo $img; ?>

    • ベストアンサー
    • PHP
  • 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の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> 自分ではいったいなにが悪いのか分かりません。 どのたかお分かりになるかたいましたらご教授していただけませんでしょうか。 お願いします。

  • MYSQLから画像を取り出したい

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

    • ベストアンサー
    • 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
  • MySQLに保存した画像を表示したい

    <環境> PHP:4.3.8 MySQL:4.0.16 はじめまして、PHPを始めて駆け出しの者です。 MySQLに保存した画像を表示したいのですが なかなかうまくいきません。 なにかきっかけとなればと思い、書き込みをします。 どうぞご教授ください。 MySQLに画像を保存する事もやっとの事で出来たのですが、 ちゃんと保存されているか確認するため画像を表示してみよう と試みたのですが、またそこで壁にぶち当たってしまいました。 ネットの各所で検索し調べ、カタチまでは出来たのですが 肝心の画像が「×(バツ印)」になっていて表示出来ません。 +++img_upload.php+++ <?php if ($_POST["submit"]!=""){ if ($_POST["file_name"]=="none"){ print("ファイル名が入力されていません。<BR>\n"); exit; } $file_name = $_POST["file_name"]; if ($_FILES["upfile"]["tmp_name"]=="none"){ print("ファイルのアップロードができませんでした。<BR>\n"); exit; } $fp = fopen($_FILES["upfile"]["tmp_name"], "rb"); if(!$fp){ print("アップロードしたファイルを開けませんでした"); exit; } $imgdat = fread($fp, filesize($_FILES["upfile"]["tmp_name"])); fclose($fp); print("ファイルサイズ:{$_FILES["upfile"]["size"]}<BR>\n"); $len = strlen($imgdat); print("データ長 = $len<BR>"); $imgdat = addslashes($imgdat); $con = mysql_connect("***.***.***.***", "*****", "*****"); if (!$con){ print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("*****")){ print("データベースへの接続に失敗しました"); exit; } $encoded_file = base64_encode($imgdat); $sql = "INSERT INTO image (img_data) values ('$encoded_file')"; $result = mysql_query($sql); if (!$result){ print("SQLの実行に失敗しました<BR>"); print(mysql_errno().": ".mysql_error()."<BR>"); exit; } mysql_close($con); } ?> +++img_display.php+++ <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <TITLE>データベースへの画像の表示</TITLE> </HEAD> <BODY> <P>ファイルの表示</P> <FORM method="POST" enctype="multipart/form-data" action="img_display.php"> <INPUT type="hidden" name="MAX_FILE_SIZE" value="1048576"> 画像のファイルIDを入力してください<BR> <INPUT type="text" name="log_id"><BR> <INPUT type="submit" name="submit" value="送信"> <INPUT type="reset" name="reset" value="リセット"> </FORM> <?php if ($_POST["submit"]!=""){ $log_id = $_POST['log_id']; echo "<img src=\"get_image.php?log_id=" . $log_id . "\">"; } ?> </BODY> </HTML> +++get_image.php+++ <?php if ($_GET["log_id"]!=""){ $log_id = $_GET['log_id']; $con = mysql_connect("***.***.***.***", "*****", "*****"); if (!$con){ print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("******")){ print("データベースへの接続に失敗しました"); exit; } $sql = "SELECT img_data FROM image WHERE log_id='".$log_id."'"; $result = mysql_query($sql); if (!$result){ print("SQLの実行に失敗しました<BR>"); print(mysql_errno().": ".mysql_error()."<BR>"); exit; } $row = mysql_fetch_array($result); mysql_close($con); $decoded_file = base64_decode($row[1]); mb_http_output("pass"); header("Content-type: image/jpeg"); header("Content-Disposition: inline; filename=image.jpg"); echo $row[0]; } ?> DBのほうのテーブルには、「log_id」と「img_data」があります。 すみませんが、よろしくお願いします。

    • ベストアンサー
    • 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
  • 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
  • MySQLへの画像の保存→表示で画像が崩れる

    PHP+MySQLで、画像(jpg)の保存、表示を試みていますが、 どうもうまくいかないので、お知恵をお貸しください。 MySQLのMEDIUMBLOBに画像を保存すること自体はうまく行っているように見えるのですが、 取り出して表示をする際に、画像の一部が崩れてしまいます。 <環境> MySQL4.0.26 PHP 5.0.4 500バイト程度の小さな画像だと崩れませんが、 大きな画像(1.6k程度)だと、 画像が崩れます。 コードを記述したいのですが、文字数制限があるので、 一部省略/抜粋で掲載します <アップロード/保存> $fp = fopen($_FILES["file"]["tmp_name"],"rb"); $imgdat = fread($fp,filesize($_FILES["file"]["tmp_name"])); fclose($fp); $imgdat = base64_encode($imgdat); $imgdat = addslashes($imgdat); //$imgdat = mysql_escape_string($imgdat); $sql = "insert into test_img(imgfile)values('".$imgdat."')"; (以下略) <表示> $sql = "select * from test_img order by no desc limit 1"; $result = mysql_query($sql,$dbid); $rows = mysql_fetch_array($result); $imgdat = stripslashes($imgdat); $imgdat = base64_decode($rows["imgfile"]); header('Content-Type: image/jpeg'); echo stripslashes($imgdat); (以下略) 保存時にaddslashes 復帰時にstripslashes してもうまくいきませんでした。 他の掲示板で調べた、base64エンコード/デコードを試みましたが、 これも結果は同じです。 どうかよろしくお願い申し上げます。

    • ベストアンサー
    • 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

専門家に質問してみよう