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

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

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

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

PHP

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

Q&A

解決済

2回答

3846閲覧

jpgでデータベースに保存した画像が表示できません

astroecology

総合スコア7

PDO

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

PHP

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

0グッド

0クリップ

投稿2016/12/17 17:22

編集2016/12/17 17:25

###前提・実現したいこと
スタッフのマニュアル用にアプリを制作しており、テキスト関係の表示や編集機能はほぼできたのですが、画像を取り込んでよりわかりやすいマニュアルにしたいと思っています。
画像のデータベースへの保存はできたのですが、出力ができません。

###発生している問題・エラーメッセージ
画像を出力しようとすると、文字化けした文字列が出てきます。

###該当のソースコード
PHP

<!DOCTYPE html> <html lang="ja"> <?php if (isset($_GET['name'])) { $name = $_GET['name']; } function getPDO() { // PHP Data Object を返す $dataSourceName='●●●;dbname=●●●;charset=utf8'; $user='●●●'; $dbPassword='●●●'; return new PDO($dataSourceName, $user, $dbPassword); } // 拡張子によってMIMEタイプを切り替えるための配列 $MIMETypes = array( 'png' => 'image/png', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', ); try { $pdo = getPDO(); $tableName = "ImageData"; // データベースから条件に一致する行を取り出す $data = $pdo->query('SELECT * FROM ImageData WHERE name = "' . $name . '"')->fetch(PDO::FETCH_ASSOC); // 画像として扱うための設定 header('Content-type: ' . $MIMETypes[$data['extension']]); echo $data['image']; } catch (Exception $e) { echo "load failed: " . $e; } ?> </html>

###試したこと
ImageDataというテーブルには、数十キロバイトのimageがmediumblobで保存されています。
URL末尾に「?name=logo1」というようにすると、logo1は正しくGETされます。
$DATA('name'), $DATA('extension')ともにechoで正しく表示されました。

###補足情報(言語/FW/ツール等のバージョンなど)
プログラムはutf-8、BOMにチェックなし、改行コード変換なしで保存しています。
画像はjpgで試しています。

EXCEL VBAはかなり経験しましたが、PHPはまだ一か月ほどしか経験していません。なにが原因でうまく表示されないのでしょうか。なにとぞ、ご教示のほどよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

画像を保存したカラムの型は何になっていますか?
画像はバイナリなので、BLOB(またはMEDIUMBLOBやLONGBLOB)型じゃないとダメです。

また、そもそもDBに画像を入れるということ自体がバッドプラクティスです。
DBに直接画像そのものを保存するメリットはほとんどありません。デメリットは多数あります。

PHP - PHP、SQL画像出力の際に画像が一部黒くなります。(50088)|teratail

MySQLに画像データのパスを保存する理由を教えて下さい。 - あるP... - Yahoo!知恵袋

投稿2016/12/18 00:27

zico_teratail

総合スコア907

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

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

astroecology

2016/12/18 00:59

ありがとうございます。 最初はBLOB型にしていましたが、サイズの問題があるかもしれないと思い途中からMEDIUMBLOBに変えました。 しかし、いずれの場合も、文字化けのようになります。 もしどうしてもうまく行かないときは、通常のアップロードでパスを保存する方式に変更したいと思います。
guest

0

ベストアンサー

header('Content-type: ' . $MIMETypes[$data['extension']]);

image/jpeg で表示する目的なので、

<!DOCTYPE html> <html lang="ja">

</html>

などの文字列や改行コードなどを出力してはいけません。

投稿2016/12/18 02:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

astroecology

2016/12/18 02:47

ありがとうございます ! 今までの労苦がウソのように、あっさりと画面に美しく表示されました ! 他のコードと混在させることは難しそうなので、画像取り込みは別ファイルにするなどの工夫をした方がいいのかもしれません。 先程のいただいたご回答と合せ、パスのみデータベース保存にするか等、さらに検討したいと思います。 皆さまありがとうございました ! またよろしくお世話になると思いますが、よろしくお願いします。
退会済みユーザー

退会済みユーザー

2016/12/18 02:51

画像部分以外にも問題が多数見受けられます。 丹念に修正すべきです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問