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

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

ただいまの
回答率

90.53%

  • PHP

    20254questions

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

PHP mysqlでバイナリデータがとれず、Stringで帰ってきてしまう。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 424

chNOBUNAGA

score 31

PHPでバイナリで保存した画像データを表示しようとしているのですが、
うまくできません。

<?php
function get_imges($post_id){



$getimg="SELECT imgs from bb where a=".$post_id;
echo $getimg;
$result = mysql_query($getimg);
if (!$result) {
    die('クエリーが失敗しました。'.mysql_error());
}

$row = mysql_fetch_row($result);

// 画像ヘッダとしてjpegを指定(取得データがjpegの場合)
header("Content-Type: image/jpeg");

// バイナリデータを直接表示
echo gettype($row[0]);

mysql_close($link);
}
?>

どのようにしたらばいなりで取得できるのでしょうか?

追記:検証コード結果を送付します。

検証コード

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+3

PHP ではバイナリを扱うための特別な型というのは存在せず、文字列であろうと画像のバイト列であろうとすべて string として扱われます。NUL 文字があろうとそれを問題なく処理する関数が多いということです。これについては次のページを参照してください。

文字列型の詳細 - PHP: 文字列 - Manual

つまりデータベースから文字列を取得するのも画像のバイト列を取得するのも PHP では同じ操作で行うことができるということです。

次にブラウザーが Web 上に表示された画像をどのように表示するかを考えてみます。ブラウザーがサーバーからデータを受信するときにそれをどのように表示するかどうかは HTTP ヘッダーというデータを参考にすることになっています。実際にはブラウザーがこれを無視して適切な表示を試みる場合がありますが、ひとまずヘッダーを理解してみましょう。

一般的なページは HTML 形式で表示されます。たとえば次のような文字列が含まれています。

Content-Type: text/html; charset=utf-8

これはサーバーがクライアントに対して「コンテンツは HTML 形式でエンコードは UTF-8 ですよ」と送っているわけです。これを受けてブラウザーは受け取ったデータを HTML 形式で解釈して読み取るわけです。

一方で画像はどうでしょう? 画像は HTML ではないのでこのままではブラウザーが HTML だと思っていてうまく表示されません。そこで登場するのが header 関数で、ブラウザーに JPEG であることを通知しています。ただしこれが使える条件が呼び出しより前に出力をしていないことです。ページの途中で画像を送信したい場合などはこれでは不便ですね。

どうしても header を使いたくない場合は次のようにします。ただしファイルサイズが平均で 30% 程度増えます。

$data にデータベースから取り出した JPEG データが入っていると仮定する)

<img src="data:image/jpeg;base64,<?= base64_encode($data) ?>">

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/11 07:48

    できました。ありがとうございます。

    キャンセル

+1

$getimg="SELECT imgs from bb where a=".$post_id;
// echo $getimg; // <- ここをコメントにする

検証コード

これをそのまま既存の部分に置き換えて、ブラウザに表示されたものを、転記するか、スクリーンショットを提示してください。

<?php

function get_imges($post_id)
{
    $getimg = "SELECT imgs from bb where a=" . $post_id;

    $result = mysql_query($getimg);
    if (!$result) {
        die('クエリーが失敗しました。' . mysql_error());
    }
    $row = mysql_fetch_row($result);

    // 画像ヘッダとしてjpegを指定(取得データがjpegの場合)
    if (headers_sent()) {
        die('すでに何らかの出力があります。');
    }
    header("Content-Type: image/jpeg");

    var_dump($row);

    // バイナリデータを直接表示
    echo $row[0];

    mysql_close($link);
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/05 15:05

    取得が、string型で帰ってきてしまいます。
    get typeで取得すると、stringになってしまいます。

    キャンセル

  • 2017/03/05 15:06

    そもそも、どういう形式で保存したの?

    キャンセル

  • 2017/03/05 15:57

    バイナリ形式で保存しました。

    キャンセル

  • 2017/03/05 16:01 編集

    バイナリで保存しているというのなら、表示されるはずです。表示されないという現象がある以上、「正しく」保存されているのかが問題だということです。

    タイムリーにこの記事書いたので、飛んでおくといいかもしれません。
    http://qiita.com/ShibuyaKosuke/items/dbe45cbf43bd819bf6cc

    キャンセル

  • 2017/03/05 16:14

    phpadminからデーターベースのからむをとると、

    .binで保存されるのですが、それでは画像が表示されます。

    キャンセル

  • 2017/03/05 16:17 編集

    「header() 関数より前で、いかなるデータの出力もされてはいけない。」<- この意味理解できますか?

    というか、gettype() の関数の意味わかって使っているんでしょうかね‥

    キャンセル

  • 2017/03/05 17:54

    修正をしてみますが、
    Headerを使わない方法はありますでしょうか?

    キャンセル

  • 2017/03/05 17:55

    まずは聞かれたことに答えてください。

    キャンセル

  • 2017/03/05 17:58

    ヘッダーは、理解していましたが
    不覚でした。gettypeは、型を返す関数ですよね?

    キャンセル

  • 2017/03/05 18:00

    自分で書いたコードでしょ?

    キャンセル

  • 2017/03/05 18:17

    はい。
    そうです

    キャンセル

  • 2017/03/05 18:26

    あのねぇ…
    はいそうですって…
    「自分で書いたコードでしょ?」=「意味もわからずに書いてるんじゃ、プログラミングなんてできんだろ」て意味だから。

    とりあえず、回答に追記した検証コードの結果伝えられない限り、これ以上のアドバイスできんから。

    キャンセル

  • 2017/03/06 00:13

    すいません。よろしおねがいします。

    キャンセル

+1

まずstring型であることは問題ありません。中身はバイナリデータです。
画像ファイルを読み込んで変数に入れたものも、型はstringです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/05 17:49

    Echo表示しましたが、
    文字化けして表示されます。
    また、ヘッダーをいれても
    なにも表示されません

    キャンセル

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

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

関連した質問

  • 解決済

    SHOW TABLES について

    指定したデータが含まれるテーブル名を取得(表記)したいのですがうまくできません。ご教授よろしくお願いいたします。コードは以下の通りです。 (素人ながら、こうかなと思っているのは

  • 解決済

    プルダウン選択時にMySQLの値を参照し、2つ目のプルダウンに表示させたい

    前提・実現したいこと ・MySQLのデータとphpを使って連動式プルダウンを作りたい 発生している問題・エラーメッセージ 現在phpとMySQLの勉強中です。 MySQ

  • 解決済

    MySQL,PHPの投稿削除機能を備えた掲示板

    前提・実現したいこと MySQL、PHPについての質問です。 削除機能を備えた掲示板を作ろうとしています。 phpMyAdminにXXXというテーブルを設定し、 それぞ

  • 解決済

    MySQL PHPについて

    このコードで「ページは機能していません」というエラーがでます。なぜでしょうか? <?php try { $db = new PDO("mysql:host=mys

  • 受付中

    php mysqlから画像を取り出す方法

    <?php include "php/config.php"; se

  • 解決済

    mysqlからとってきたデータをhtmlのテーブルのように整列させたい。

    前提・実現したいこと PHPでSQLよりデータを抽出し、htmlのテーブルのような形に成形し出したいと思っています。 現在は<pre>を使用し見やすい形にはなっているのです

  • 解決済

    PHPの日時の処理

    PHPの日時の処理について質問をさせていただきます。 例えば、フォームからのリクエストで下記のようなものがあるとします。 開始月: 2016-01-01 00:00:00

  • 受付中

    phpにかんしてです

    どのようにプルダウン式で選択後送信したらはんえいできます?詳しいサイトなどありますか?

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

  • PHP

    20254questions

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