mysqlのblob型が表示できません - PHPプロ!Q&A掲示板

1583

  • 0P

mysqlのblob型が表示できません

質問日時 / 2008年10月22日 01:31    回答数 / 5件

Questioner:  imonii  このエントリーをはてなブックマークに追加 

キーワード / mysql    blob    表示   

質問のタイトルで悩んでいます。どうか宜しくお願いします。
PHP   ver. 5.2.5
mysql ver. 4.1

以下のソースでmysqlのblob型を表示しようとしてるのですが、×マークで画像が表示できていない状態です。

■呼び出し元ソース
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<HEAD>
<TITLE>メニューページ</TITLE>
</HEAD>
<BODY>
<img src="shop_img.php?id=1&type=event">
</BODY>
</HTML>

■shop_img.php
※$id及び$typeは取得済み

$DB = AdoDB::getInstance();
$DB->connect(DbConstant::C_DB_HOST, DbConstant::C_DB_USER, DbConstant::C_DB_PASS, DbConstant::C_DB_NAME);
if (!$DB) {
die("接続に失敗しました。");
}

if (strcmp($type, "banner") == 0) {
$sql = 'select img_banner from shop_info where id = ?';
$imgField = 'img_banner';
} else if (strcmp($type, "event") == 0) {
$sql = 'select img_event from shop_info where id = ?';
$imgField = 'img_event';
}

$stmt = $DB->Prepare($sql);
$resultSet = $DB->execute($stmt, array($id));

if (!$resultSet) {
echo "エラー:".$DB->ErrorMsg()."\n";
}

while (!$resultSet->EOF) {
$image = $resultSet->fields[$imgField];
$resultSet->moveNext();
}

//**********************
//* 画像表示部
//**********************

header("Content-type:image/gif");
print (base64_decode($image));
}

以上がソースになります。
headerを外すと文字化けしたような文字列(base64エンコードされた?)が画面に表示されます。
データは取得できているようなのですが、どうしても表示されません。
かなり長い間悩んでいますのでどうか宜しくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01mgngmgngDBの画像データがバイナリで格納されているのであれば
┃┗A01-1imonii返事ありがとうございます。 カラムの型をblob ⇒ tex
┃ ┗A01-1-1mgngmgngheader("Content-type:image/gif"); をコールする前
┗A02kaitauおはようございます。 次の4点についてあやしいと
 ┗A02-1imonii現場が忙しくなり、返事遅れましてすいません。 自己

回答一覧

並び替え:

A01
answerermgngmgng [10月22日 09:50]

DBの画像データがバイナリで格納されているのであれば
base64_decodeいらないのでは?

この意見に回答する

ツリーへ TOPへ

A01-1
replyerimonii [10月23日 00:12]

返事ありがとうございます。
カラムの型をblob ⇒ textに変更して実行。
blobのままでbase64encode, base64decodeの関数を外して実行。

どちらも同じ結果でした。
×が表示されて画像が表示されないようです。

引き続きどうか宜しくお願いします。

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyermgngmgng [10月24日 11:10]

header("Content-type:image/gif");
をコールする前に、
改行や半角スペースやその他文字列(エラーなど)が出力されていませんか。

これはOKですが
  1. <?php
  2. header("Content-type:image/gif");
  3. print file_get_contents('./test.gif');

こっちはNGです(先頭行に改行あり)
  1.  
  2. <?php
  3. header("Content-type:image/gif");
  4. print file_get_contents('./test.gif');

この意見に回答する

ツリーへ TOPへ

A02
answererkaitau [10月23日 10:46]

おはようございます。

次の4点についてあやしいところはありませんか。

1. dbに保存する前(のbase64エンコード前)の画像データをブラウザで表示できるか
2. そもそもblob型に保存する時に正しく保存できているか
3. dbからの取り出し方法を間違えていないか
4. dbからの取り出しなしで(ファイルからの読み込みなどで)画像を動的に表示できるか

この意見に回答する

ツリーへ TOPへ

A02-1
replyerimonii [10月24日 22:47]

現場が忙しくなり、返事遅れましてすいません。
自己解決しましたので報告します。

新規PHPファイルを作成し、ネット上のソースをそのままもってきたところ表示ができました。
そのソースを現状の動かないPHPファイルに丸々コピーしたところ表示ができませんでした。

ソースがまったく同じなのにどうして?

と考えたところ、後は文字コードしか浮かばなかったので二つのファイルの文字コードを比較してみました。

動くソース:UTF-8 BOMなし
動かないソース:UTF-8 BOMあり

もしや?と思ってBOMなしに変換したところ動くようになりました!

個人的な問題なのに色々アドバイス頂いてありがとうございます。
今後の何かの参考になればと思います。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
セッションがいいのか、それともデータベースがいいのか教えて下さい。
 このエントリーをはてなブックマークに追加 
A
>ボタンをクリックしたら選んだ商品情報を持っておきたいと思っています。 そのくらいのことならセッションもしくはCookie(期限短め:場合によってはブラウザ閉じるまで)でいいんじゃないですかね。 #わ...

>>続きを読む

一つの目安として、ECサイトの購入情報など絶対に消えてはいけないものはDBに、カートなどの一時的に使用する情報や、ユーザに任意のタイミングで消去されても構わないものはセッションにと使い分けるといいでしょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)