質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

20719閲覧

php DBに保管したBLOB形式の画像を表示させたい

earnest_gay

総合スコア615

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/01/24 08:13

編集2017/01/24 08:58

画像をアップローダーからDBに登録するまではできたのですが、表示させることができません。

どのように取り出してよいのかがわかっていないので表示ができないです。

イメージ説明

DBに登録されている画像データをDLしてimage-image.binをimage-image.pngに変えるとちゃんと観れるので登録は問題ないと思います。

無茶苦茶かもですが、とりあえず取り出して表示しようとしているところです。

php

1$sql = "SELECT image FROM image"; 2 $stmt = $pdo->query($sql); 3 $img = $stmt->fetchObject(); 4 5header("Content-Type: image/png"); 6 echo $img->contents;

いろいろ調べているのですが、pdoでのやり方がなくてつまづいています。
表示させるにはどうしたらよいでしょうか???

*追記

いろいろ調べてるうちになにやらHTML出力などを含めるとエラーになるらしいので下記のようにファイルを分けて試してみると表示されました。

しかし、やりたいことは
例えばfacebookなどのようなとある会員サイトでプロフィール画像を変更するときに
見かけ上はシングルページで完結しているように思わせるような動きをさせたいのです。

そういうサイトは、ユーザーからしてみれば1つのファイルで画像を入れ替えしているような感覚になりますが、実は裏でPOST送信とかで画像を渡したりして表示させているのでしょうか?

そこらへんの仕組みも知りたいです。

php

1 2test.php 3 4<?php 5 6if (isset($_POST["submit"])){ 7 8 $upfile = $_FILES["upfile"]["tmp_name"]; 9 if ($upfile==""){ 10 print("ファイルのアップロードができませんでした。<BR>"); 11 exit; 12 } 13 14 // ファイル取得 15 $imgdat = file_get_contents($upfile); 16 $imgdat = mysql_real_escape_string($imgdat); 17 18 // DB接続 19 $dsn = "mysql:host=127.0.0.1;dbname=games;charset=utf8;"; 20 21 // PDO 接続の失敗を検知する例外処理。 22 try { 23 $pdo = new PDO( 24 $dsn, 25 "root", 26 "********", 27 array( 28 PDO::ATTR_PERSISTENT => true, 29 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', 30 PDO::MYSQL_ATTR_LOCAL_INFILE => true 31 ) 32 ); 33 34 // SQL トランザクションの例外を検知する。 35 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 36 37 } catch (PDOException $e){ 38 print_r($e->getMessage(), true); 39 exit; 40 } 41 42 // データ追加 43 $sql = "INSERT INTO image (image) VALUES ('$imgdat')"; 44 $stmt = $pdo->query($sql); 45 46 if ($stmt == false){ 47 print("SQLの実行に失敗しました<BR>"); 48 exit; 49 } 50 51 print("登録が終了しました<BR>"); 52 53 header( "Location: result.php" ) ; 54 exit; 55 56} 57 58 59 60 61 ?> 62<HTML> 63 <HEAD> 64 <meta charset="UTF-8"> 65 <title>画像登録&アップロード</title> 66 </HEAD> 67 <BODY> 68 <FORM method="POST" enctype="multipart/form-data" accept-charset="utf-8" action=""> 69 <P>画像登録&アップロード</P> 70 画像パス:<INPUT type="file" name="upfile" size="30"><BR> 71 <INPUT type="submit" name="submit" value="送信"> 72 </FORM> 73 </BODY> 74</HTML> 75 76

php

1 2result.php 3 4$contents_type = array( 5 'png' => 'image/png', 6 'jpg' => 'image/jpeg', 7 'jpeg' => 'image/jpeg', 8 'gif' => 'image/gif', 9 'bmp' => 'image/bmp', 10 ); 11 12 try { 13 14 $sql = "SELECT * FROM image WHERE id = 1"; 15 $stmt = $pdo->query($sql); 16 $img = $stmt->fetch(PDO::FETCH_ASSOC); 17 18 header('Content-type: ' . $contents_type[$img['type']]); 19 echo $img['image']; 20 21 } catch (Exception $e) { 22 echo "load failed: " . $e; 23 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

HTMLの中に画像を埋め込んで返すのであれば、base64エンコードした文字列をimgタグのsrcに埋め込む方法があります。
http://d.hatena.ne.jp/moogme/20090814/p3

しかし、この方法はあくまで「小さな画像」向けであり、なにか特別な事情でもない限り普通やりません。なぜなら、画像を文字列として埋め込むことで1ページの容量が跳ね上がり、さらにブラウザ内のキャッシュが使いにくくなるからです。同じユーザが何度も同じページにアクセスする場合、キャッシュされない場合1MBのページ容量差で100回アクセスすれば、それだけで通信負荷が100MB違うことになります。

すでに画像単体で出力できるresult.phpというphpがあるのであれば、そのURLをimgタグのsrcに指定してやればよいのです。

html

1<div>ID1の画像</div> 2<img src="result.php?id=1"><!--クエリで検索するIDを指定してやればよい-->

これでHTMLの中にID1の画像が埋め込まれるはずです。

投稿2017/01/25 00:25

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2017/01/25 02:30

ありがとうございます!
guest

0

状況がよくわからないですが
これは画像ローダーのような仕組みを考えているのでしょうか?

imgload.php?id=1
のようにしてidが参照できるなら

PHP

1$sql = "SELECT image FROM image where id=?"; 2$stmt = $pdo->prepare( $sql); 3$stmt->execute([filter_input(INPUT_GET,'id')]); 4$row = $stmt->fetch(PDO::FETCH_ASSOC); 5header("Content-Type: image/png"); 6print $row["image"];

のような形になります。
ただしmimetypeはDB側にとっておかないと例示の通り場合分けができず
固定値を指定することになりjpegなのにヘッダがpngなど仕様がおかしくなるでしょう

投稿2017/01/24 08:40

yambejp

総合スコア114505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2017/01/24 08:45

とりあえず表示させたいのでいろいろ試している段階ですが、最終的には とある会員サイトのマイページからプロフィール画像的なものを登録させるようにしようとしています。 mimetypeとはなんなのでしょうか?
yambejp

2017/01/24 09:05

すみません 質問者さんの例示で言う「Content-Type」のことです
guest

0

HTML

1<?php 2 $sql = "SELECT * FROM image WHERE id = 1"; 3 $stmt = $pdo->query($sql); 4 $img = $stmt->fetch(PDO::FETCH_ASSOC); 5?> 6 7<img src="data:image/png;base64,<?php echo base64_encode($img['image']);>>

と言うように、HTMLタグに直接データを埋め込む事も出来ます。
こっちの方が、一々リダイレクトをする事もなく、レイアウトも自由に出来るのではないかと思います。

投稿2017/01/24 09:03

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2017/01/24 09:24

小さい画像アイコンが表示されるだけで実際の画像は表示できないようですよ、、、 $sql = "SELECT * FROM image WHERE id = 1"; $stmt = $pdo->query($sql); $img = $stmt->fetch(PDO::FETCH_ASSOC); //header('Content-type: ' . $contents_type[$img['type']]); //header( "Location: result.php" ) ; //exit; } ?> <HTML> <HEAD> <meta charset="UTF-8"> <title>画像登録&アップロード</title> </HEAD> <BODY> <img src="data:image/png;base64,<?php echo base64_encode($img['image']);?> > <FORM method="POST" enctype="multipart/form-data" accept-charset="utf-8" action=""> <P>画像登録&アップロード</P> 画像パス:<INPUT type="file" name="upfile" size="30"><BR> <INPUT type="submit" name="submit" value="送信"> </FORM> </BODY> </HTML>
turbgraphics200

2017/01/24 10:26

imgのsrc属性が"で閉じられていないようですけど
earnest_gay

2017/01/25 02:29

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問