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

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

ただいまの
回答率

90.62%

  • PHP

    19891questions

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

  • HTML

    8697questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • MySQL

    5706questions

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

PHPで画像を取得してMySQLに保存、そしてMySQLからデータを取得して表示させる方法がわかりません

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,914

tada_tadaa

score 83

phpの初心者です。
このたびphpで画像をmysqlに保存して、そしてmysqlからデータを取得して表示させることに
チャレンジしてみることにしました。
以下のサイトを参考にさせていただきました。
http://www.kantenna.com/pg/2010/04/phpmysql.php

そしてmysqlでデータベースを作成してテーブルを作成しました。

     CREATE DATABASE tada;
      
     CREATE TABLE images (
     id int NOT NULL AUTO_INCREMENT,
     ext varchar(5),
     contents blob,
     PRIMARY KEY (id)
     );

insert.phpとimg.phpのファイルを作成しました。


insert.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
</head>
<body>

     <?php
     // 画像と拡張子を取得
     $img_path = 'C:/Program Files/Apache Software Foundation/Apache2.2\htdocs/img/ApacheMonitor.jpg';
     $img = file_get_contents($img_path);
     $ext = pathinfo($img_path, PATHINFO_EXTENSION);
      
     // データベースに保存
     $pdo = new PDO('mysql:host=localhost; dbname=tada', 'root', 'pass'');
     $stmt = $pdo->prepare('INSERT INTO images VALUES(0, :ext, :img)');
     $stmt->bindParam(':ext', $ext);
     $stmt->bindParam(':img', $img);
     $stmt->execute();
     ?>

</body>
</html>


img.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
</head>
<body>
<?php
     // クエリの取得
/*
     if (preg_match('/^[0-9]+$/', $_GET['key'])) {
         $id = $_GET['key'];
     } else {
         throw new Exception('エラー');
     }
  */
    $id = 1;
    
     // データベースから対象のデータを取得
     $pdo = new PDO('mysql:host=localhost; dbname=tada', 'root', 'pass');
     $stmt = $pdo->prepare('SELECT ext, contents FROM images WHERE id=:id');
     $stmt->bindParam(':id', $id);
     $stmt->execute();
      
     // Content-typeテーブル
     $contents_type = array(
         'jpg'  => 'image/jpeg',
         'jpeg' => 'image/jpeg',
         'png'  => 'image/png',
         'gif'  => 'image/gif',
         'bmp'  => 'image/bmp',
     );
      
     // 出力
     $img = $stmt->fetchObject();
     header('Content-type: ' . $contents_type[$img->ext]);
     echo $img->contents;
     ?>
</body>
</html>

insert.phpを実行するとエラーなく実行されます。phpMyAdmin 3.4.9 で、画像のデータを
保存して、拡張子をjpgにするとまた、元の画像が表示されますので画像データは壊れ
ずにmysqlに格納されたであろうことがわかります。

しかし、img.phpを実行するとFirefoxブラウザ(バージョン39)では
「画像ファイル "http://localhost/musen/img.php"は壊れているため、表示できませんでした。」
と表示されます。IE(バージョン8)では画像ではなく、文字化けの文章が表示されてしま
います。Chrome(バージョン 44)でも、画像は表示されず、画像が壊れていることを示
すアイコンが表示されています。

http://dev.ontheroad.jp/archives/11970
↑でHTTP 通信の内容をChromeで確認できるとのことでさっそく試してみました。
以下にその時の通信内容をキャプチャした画像を添付します。

イメージ説明
何が原因でmysqlに保存した画像データがブラウザに表示されないのでしょうか?
どなたかアドバイスをよろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

画像出力の祭は、HTMLタグ等の出力はしてはいけませんので、
img.phpの
<!DOCTYPE... から <body> までの削除と、
最後の</body></html> を削除してお試しください。
空白や改行等、余計な出力もダメです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/14 00:30

    早速のお返事ありがとうございます。
    rik様のおっしゃるとおりにしたら無事に画像が表示されました。
    非常に助かりました。
    ありがとうございました。

    キャンセル

  • 2015/08/14 00:54

    無事に解決できてなによりです。
    上記の方法ではhtmlのタグを全部外しましたが、htmlファイルに画像を読みこめるか試して
    みました。
    僕のような初心者の方がほかにもおられることを想定して、参考にしていただければと思います。
    まず、htmlのタグ等を全部外したimg2.phpを作成したらうまく画像が表示されました。次に
    img2.phpを外部htmlファイルで読み込むことで、htmlファイルでmysqlにアップした画像データの
    表示に成功しました。以下にソースを書いておきます。

    外部htmlファイル

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <title></title>
    </head>
    <body>
    <img src="img2.php" alt="" />

    </body>
    </html>

    これでmysqlにアップロードした画像データを、取得してhtmlファイルに表示させることができます。

    キャンセル

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

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    19891questions

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

  • HTML

    8697questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • MySQL

    5706questions

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

  • トップ
  • PHPに関する質問
  • PHPで画像を取得してMySQLに保存、そしてMySQLからデータを取得して表示させる方法がわかりません