PHP以前に,HTTPの仕組みをわかっていなければこのコードがやっていることも理解できないと思います.まず以下を一読してください.とくに今回Content-Typeヘッダは重要です.
前提として,PHPはデフォルトでは以下のようなContent-Typeヘッダを出すようになっています.
つまり特に設定しなければ,PHPが送出するデータはHTMLとして取り扱われるということです.ここでheader関数の第2引数をtrue(デフォルトではこれ)にして使うと,規定されている同一名称のヘッダを上書きすることができます.ご提示のコードではJPEG画像として表示させるためにimage/jpeg
とされていますよね.
注意して欲しいのは,HTTP通信では原則的に1リクエストにつき1つのファイルしか返せないということです.では,画像を含むHTMLはどうやって表示されているのでしょうか?答えは,取得したいデータごとにWebブラウザが個別にHTTPリクエストを実行している,です.例えば http://example.com/index.php が返すコンテンツに
html
1<img src="images/logo.png">
というHTMLタグが含まれていれば,
1. http://example.com/index.php
2. http://example.com/images/logo.png
というように続けてHTTPリクエストが行われます.
さて,ここまで説明したことを踏まえると,やっていることがおかしい,ということに気づけるんじゃないでしょうか.そこでどうすべきかという話になりますが,方法は2つあります.
PHPによるレスポンスを単一の画像ファイルにする
単一の画像を返すだけのPHPスクリプトを書いておいて,
html
1<img src="image.php?id=1">
のような感じでimg要素のsrc属性にPHPスクリプトを指定する,という方法です.但し,この方法だとSELECTを何回も実行する必要があり,効率を考えるとあまり良くない方法になってしまうと思います.
データURIスキームにしてHTMLに埋め込む
実は,HTML中に画像データをそのまま埋め込んでしまう方法も用意されているんです.
但し画像の生データをそのままでは埋め込めないので,BASE64エンコードを通じてアルファベットと記号の羅列だけに変換します.画像サイズが極端に大きくなければこれで捌けると思います.
html
1<img src="data:image/jpeg;base64,<?=base64_encode(画像データ)?>">
【実装例】
html
1<?php
2
3try {
4
5 // 接続
6 $pdo = new PDO('mysql:dbname=share_note;charset=utf8;host=localhost', 'root', '', [
7 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // SQL実行に失敗した場合にもPDOExceptionを投げる
8 ]);
9
10 // 画像データを1次元配列として取得
11 // 取り扱いやすいが,画像サイズ総量が大きい場合にメモリがつらい
12 // $images = $pdo->query('SELECT img FROM images')->fetchAll(PDO::FETCH_COLUMN, 0);
13
14 // 画像データを取り出せるイテレータとして取得
15 // やや取り扱いにくいが,画像サイズ総量が大きくても余裕
16 $images = $pdo->query('SELECT img FROM images');
17 $images->setFetchMode(PDO::FETCH_COLUMN, 0);
18
19} catch (PDOException $e) {
20
21 // 500 Internal Server Errorでテキストとしてエラーメッセージを表示
22 header('Content-Type: text/plain; charset=UTF-8', true, 500);
23 exit($e->getMessage());
24
25}
26
27// HTMLとして表示 (文字コードもここで指定するために上書きする)
28header('Content-Type: text/html; charset=UTF-8');
29
30?>
31<!DOCTYPE html>
32<title>JPEG画像一覧</title>
33<style>
34 img { float: left; }
35</style>
36<h1>JPEG画像一覧</h1>
37<?php foreach ($images as $i => $img): ?>
38<img src="data:image/jpeg;base64,<?=base64_enode($img)?>" alt="画像<?=$i+1?>">
39<?php endforeach; ?>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/05 08:32
2016/06/05 10:05