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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

1回答

2289閲覧

PHP,SQLを使ったBLOB型(画像)の格納方法

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2016/09/26 06:26

編集2016/09/28 08:04

現在、PHPとSQLを使って画像表示ができずに困っていたのですがそもそも画像がうまく格納できていなかったみたいです。

再度質問内容を編集します。

お手数おかけしてしまいました。

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

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

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

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

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

kunai

2016/09/28 08:09

質問した内容が別のモノに変わるのであれば、新たに質問を起こされ、こちらはそのままにしておくことをお勧めします。 teratailのようなQAサイトでは、履歴も大事な資産になります。 既に回答が付き、議論が行われた質問の質問内容自体を変えられてしまうと、その回答も的外れなモノになってしまい、後でココを見た人が混乱されると思います。
退会済みユーザー

退会済みユーザー

2016/09/28 08:18

すいませんでした。 先ほど修正してしまった為、今後は質問をできるだけ残すようにいたします。 この度は回答及びアドバイス頂きありがとうございます。
guest

回答1

0

ベストアンサー

出力してないからでは?

PHP

1$stmt= $pdo->query("SELECT image FROM テーブル名 WHERE id=100 LIMIT 1"); 2$row = $stmt -> fetch(PDO::FETCH_ASSOC); 3header("Content-Type: image/jpeg"); 4print $row['image'];

とくに1処理で複数の画像はとりだせないのでwhileは不要です。
念の為Limit 1しておいてください

テスト用追記

PHP

1header("Content-type: application/octet-stream"); 2header("Content-Disposition: attachment; filename=\"test.jpg\""); 3header("Content-Length: ".strlen($row['image'])); 4print $row['image']; 5exit;

のように、ファイルをダウンロードさせてみて、ダンプエディタで
先頭の方のデータを検証してみてはいかがでしょうか?

投稿2016/09/26 06:33

編集2016/09/26 07:15
yambejp

総合スコア114885

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

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

退会済みユーザー

退会済みユーザー

2016/09/26 06:41

回答ありがとうございます。 print $row['image'];記載し忘れていました。 またwhileをなくした上記のコードに書き換えましたがやはりダメでした。 画像は?マークのままになります。(safari) データベースを開いて画像をダウンロードしても画像は壊れていないですし、原因がわかりません。 他に考えられる原因はありますでしょうか? よろしくお願いします。
yambejp

2016/09/26 06:49

phpはBOMを外していますか? またstrlen($row['image'])と想定したファイルサイズが合致するか確認してみてください
退会済みユーザー

退会済みユーザー

2016/09/26 07:03

回答ありがとうございます。 エディタはatomを使っており、グーグル検索ではatoはBOMなしutf-8と記事がありました。 BOMの確認方法はありますでしょうか。 echo strlen($row['image']); →28と返って来ました。 ファイル名はmessage-post_img.bin.pngで24文字(文字カウントサイトで確認済み)ということは余計な文字(BOM?)がついているのでしょうか。 だとすると質問も再編集します。
退会済みユーザー

退会済みユーザー

2016/09/26 07:16

image→post_imgです。訂正します。
yambejp

2016/09/26 07:16

ダウンロードしてみてテストをする方向どうでしょうか? 追記しておきました
kunai

2016/09/26 07:19

post_imgにはファイル名が入っているのですか?画像のバイナリデータが入っているのですか? ご回答見ていると、どうもファイル名が格納されているように見えるのですが。。。
yambejp

2016/09/26 07:19

ちなみにpost_imgに入っているのは間違いなく画像の生データなんですよね? 28バイトってなんかそうとう小さいですが・・・
ttyp03

2016/09/26 07:22

横から失礼します。 post_img は画像データではなく、画像ファイル名なのですか?
退会済みユーザー

退会済みユーザー

2016/09/26 07:22

回答ありがとうございます。 上記のコードに書き換えたところ ファイル“message-post_img.bin-3.png”を開けませんでした。ファイルが壊れているかプレビューが認識しないフォーマットを使用している可能性があります。 と表示されました。 これはBOMの可能性があるということでしょうか。
退会済みユーザー

退会済みユーザー

2016/09/26 07:23

画像は適当に小さく切り取った画像を使用しています。
yambejp

2016/09/26 07:25

生データがはいっているなら「“message-post_img.bin-3.png”を開けませんでした」とは表示されないはずですが・・・ 他の方のご指摘もありますが画像ではなくファイル名っぽいですね
退会済みユーザー

退会済みユーザー

2016/09/26 07:26

kunaiさんコメントありがとうございます。 データベースのpost_imgにはBLOB-28バイトと表示されています。 他のデータもBLOB-6.6KBと表示されています。
退会済みユーザー

退会済みユーザー

2016/09/26 07:28

ファイル名の問題はどうすればよろしいでしょうか。 てっきり画像の方の問題だと思っていました。
yambejp

2016/09/26 07:50

私が追記したダウンロードのコードで落とした画像ファイルが 本当に画像ではなく文字列がかかれているならDBへの登録時 (ファイルのアップロード時?)になんらかの入力をミスしたのでしょう 本当に画像であれば、ダウンロードしたtest.jpgをブラウザに ドラッグアンドドロップすれば画像が表示されます。 ほかのデータが6.6Kあるのに対してこのデータは28バイトっていうのが やはり人為的なミスの可能性がいなめません もしくは本当にファイルが壊れているだけかもしれないので アップロードしたデータが手元にあるなら、もとのファイルのサイズが適正かどうか? たとえばオーバーフローしてエラー情報が書き込まれているとか 検証してみてください
kunai

2016/09/26 08:11

横から何度もすみません。 取り急ぎ、その6.6KBの方はちゃんと画像データ入っているような気がしますので、そちらで動作確認されてみてはいかがでしょうか。(質問文のSQL文中のwhere のidを変更して) なぜ28byteのファイル名らしき文字が入ってしまっているのかは別途調べるとして、今回の質問にあるコードの問題についてみてみた方が良いかと。
退会済みユーザー

退会済みユーザー

2016/09/26 08:28

回答ありがとうございます。 28バイトはアドバイス通り一旦おいておきます。 現在6.6kbの方に取り掛かっていますがやはりうまくいきません。 今度はデータベース(phpmyadmin)の方にログインし、直接画像を挿入して、再度取得&表示を試みましたがダメでした。 その変わり少し前回と違ったにはechoすると表示が �8�����#d�b���tg~��Ecasnna�X��ZƵ�kZ-�W� �A�����d%�9�7��4;��Nt�׳dkqsfq[p"��L�`y!�Q<��1�D��sd�Z93X��,�ˉ�Madrid みたいな感じで表示されるようになりました。 昨日調べた感じだとこの表示になったらあとはheader("Content-Type: image/jpeg");で画像出力すれば表示されると記事で見かけたのですがヘッダー関数いれるとまた?マークになってしまいます。 何が原因かわからず困ってしまいました。 誰か同じような原因で困った方いらっしゃらないでしょうか。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/09/26 08:33

yambejpさん回答ありがとうございます。 先ほどのアドバイスを基に今度は直接データベースから画像挿入して呼び出してみました。 header("Content-type: application/octet-stream");...だとやはり同じエラーでしたが中身をechoすると�8�����#d�b���tg~��Ecasnna�X��ZƵ�kZ-�W� �A�����d%�9�7��4;��Nt�׳dkqsfq[p"��L�`y!�Q<��1�D��sd�Z93X��,�ˉ�Madrid みたいな感じで返ってきました。 これ自体は問題ないのでしょうか。 データベースへの登録が問題ならばと、直接ログインして入れてみましたがもしダメだと他に打つ手はありますでしょうか。 よろしくお願いします。
yambejp

2016/09/26 08:57

header("Content-type: application/octet-stream"); でエラーがでるのはheader出力前になにかおかしいことをしてますね? PHPでhttpヘッダを出力する前にはNULLや改行など一切の出力はNGです そもそも画像データをテーブルに投入する時点で失敗しているのでは? 仮にjpegではなくpngデータだとして、pngはファイルの頭の方にPNGだと 宣言したヘッダを含む場合が多いのですが、見た感じそれもなさそうですね (jpegならJFIFなどの記載がある)
退会済みユーザー

退会済みユーザー

2016/09/26 09:17

回答ありがとうございます。 ヘッダー出力前に何をやっているか自分でよくわからないです。 NULLや改行の有無はどうやって確認するのでしょうか。 atomでは改行LFになっています。 テーブルに投入する時点での失敗というのはデータベースログイン→直接投入も含めてでしょうか。 だとすると一から(データベース含めて)書き直した方がいいのかもしれないですね。 。
yambejp

2016/09/26 09:45

前述しましたが基本的にはダウンロードしたうえで、 ダンプエディタ(バイナリエディタ=ダンプリストがでるもの)で確認することです。 stirlingやdandpなど古くから公開されているものでよいので 検証用にひとつ落としておくと便利です。 (最近のものはよくわかりません)
yambejp

2016/09/26 09:47

ちなみに画像をテーブルに登録した時点で失敗しているのであれば なにをやっても無駄なので、まずはアップロードの仕方を よくよく検証してみるとよいでしょう prepared処理できちんと投入していますよね?
退会済みユーザー

退会済みユーザー

2016/09/28 08:05

ご連絡遅れました。 画像の挿入が出来ていなかったです。 質問内容も再度編集します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問