dbにあるバイナリデータを画像として表示したいのですが。。 - PHPプロ!Q&A掲示板

2482

  • 0P

dbにあるバイナリデータを画像として表示したいのですが。。

質問日時 / 2010年1月25日 22:53    回答数 / 2件

Questioner:  xxxamorixxx  このエントリーをはてなブックマークに追加 

キーワード / バイナリデータ    アップロード    mysql   

お世話になります。
php初心者です。かなり調べ倒したのですが分からないので質問させていただきます。

最初に自身が行いたい事は以下の2点です。

1.ローカルにある文字データや画像をdbにアップロード
2.web上で文字、画像を確認

かなりの時間粘ってローカルにあるデータをアップロードすることが出来ました。
そして文字情報だけはweb上で確認することはできたのですが画像がバイナリデータという形式に変換?
されているので画像に戻したいのですがイマイチ上手いやり方が分かりません。
ソースを書くのでご教授願いますでしょうか。

流としては

add_form.htmlという投稿画面からデータをlibrary_add.phpに送信します。
library_search.phpで確認出来るように作っています。


【add_form.html】

<form action="library_add.php" method="post" enctype="multipart/form-data">
<table border="1">
<tr>
<td>商品コード</td>
<td><input type="text" name="itemNumber"></td>
</tr>

<tr>
<td>ブランド</td>
<td><input type="text" name="brand"></td>
</tr>

<tr>
<td>区分</td>
<td><input type="text" name="division"></td>
</tr>


<tr>
<td>商品説明</td>
<td><input type="text" name="explanation"></td>
</tr>
<tr>
<td>値段</td>
<td><input type="text" name="price"></td>
</tr>
<tr>
<td>URL</td>
<td><input type="text" name="url"></td>
</tr>
<tr>
<tr>
<td>画像</td>
<td><input type="file" size="30" value="参照" name="img"></td>
</tr>
<tr>
<td colspan="2" align="center">
<INPUT type="submit" name="submit" value="送信">
<INPUT type="reset" name="reset" value="リセット"></td>
</tr>
</table>
</form>


【library_add.php】

$itemNumber = $_POST['itemNumber'];
$brand = $_POST['brand'];
$division = $_POST['division'];
$explanation = $_POST['explanation'];
$price = $_POST['price'];
$url = $_POST['url'];
$img = $_POST['img'];



$host ="localhost";
$user ="root";
$pass ="";
$database ="test";


if (!$conn = mysql_connect($host, $user, $pass)){
    die("MySQLエラー");
}
mysql_select_db($database,$conn);


 if ($_POST["submit"]!="")//
 {
  if ($_FILES["img"]["tmp_name"]=="none")//ファイルの名前が確認出来ない場合はエラー文章を
  {
   print("ファイルのアップロードができませんでした。<BR>\n");
   exit;
  }
  $fp = fopen($_FILES["img"]["tmp_name"], "rb");
  if(!$fp)
  {
   print("アップロードしたファイルを開けませんでした");
   exit;
  }
  $img = fread($fp, filesize($_FILES["img"]["tmp_name"]));
  fclose($fp);
  
  
$file_path = ($_FILES["img"]["tmp_name"]);
$image = ImageCreateFromJPEG($file_path);
$width = ImageSX($image); 
$height = ImageSY($image);
print("縦幅:{$height}<BR>\n");
print("横幅:{$width}<BR>\n");
  
  print("ファイルサイズ:{$_FILES["img"]["size"]}<BR>\n");
  $len = strlen($img);
  print("データ長 :{$len}<BR>");

  $img = addslashes($img);
  
  
$sql = "INSERT INTO test(bitemNumber,bbrand,bdivision,bexplanation, bprice, burl, bimg)
VALUES('$itemNumber','$brand','$division','$explanation','$price','$url','$img')";

mysql_query($sql , $conn)
or die("登録できませんでした");
print("登録しました。<a href=\"library_search.php\">library_search.php</a>で確認してください。");

 }



【library_search.php】

<?php

$host ="localhost";
$user ="root";
$pass ="";
$database ="test";

if (!$conn = mysql_connect($host, $user,$pass)){
    die("データベース接続エラー.<br />");
}
mysql_select_db($database , $conn);

$condition = "";

if(isset($_POST["explanation"]) && ($_POST["explanation"] != "")){
    $explanation = mysql_escape_string( $_POST["explanation"]);
    $explanation = str_replace("%", "\%", $explanation);
    $condition = "WHERE bexplanation LIKE \"%".$explanation."%\"";
}

if(isset($_POST["price"]) && ($_POST["price"] != "")){
    $price = mysql_escape_string($_POST["price"]);
    $price = str_replace("%", "\%", $price);
    if ($condition == ""){
        $condition = "WHERE bprice LIKE \"%".$price."%\"";
    } else{
        $condition .= "AND bprice LIKE \"%".$price."%\"";
    }
}

$sql = "SELECT * FROM shop ".$condition."ORDER BY bid LIMIT 50";
$res = mysql_query($sql, $conn);

/* データ取得
$users = mysql_fetch_array( $res );
echo($users);
exit;*/

print("<table border=\"1\">");
print("<tr><td>商品コード</td><td>ブランド</td><td>区分</td><td>商品説明</td><td>値段</td><td>URL</td><td>画像</td><td>更新</td><td>編集</td><td>削除</td></tr>");
while($row = mysql_fetch_array($res)) {
    print("<tr>");

    print("<td>".$row["bitemNumber"]."</td>");
    print("<td>".$row["bbrand"]."</td>");
    print("<td>".$row["bdivision"]."</td>");
    print("<td>".$row["bexplanation"]."</td>");
    print("<td>".$row["bprice"]."</td>");
    print("<td>".$row["burl"]."</td>");


print("<img src= {$row_rs1['bimg'] } >");

    print("<td>".$row["bimg"]."</td>");
    print("<td><a href= 'add_form.html'>追加</a></td>");
    print("<td><a href= \"library_editform.php?bid=".$row["bid"]."\">編集</a></td>");
    print("<td><a href= \"library_delete.php?bid=".$row["bid"]."\">削除</a></td>");
    print("</tr>");
}
print("</table>");
mysql_free_result($res);
?>






とても長くなってしまって申し訳ありません。
ソースをどこまで書けば分かりやすいのか分からなかったので全て記載させていただきました。
慣れている方が見ればとても雑なソースだとは思うのですが、
サラッと拝見していただいてヒントだけ与えていただけるのも助かりますので、
よろしくお願いします!

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┗A01shimix>print("<img src= {$row_rs1['bimg'] } >"); この
 ┗A01-1kaitau割とどうでもいい系ですが、 > ブラウザにHTMLソース

回答一覧

並び替え:

A01
answerershimix [1月25日 23:28] (最終編集:1月26日 11:15)

>print("<img src= {$row_rs1['bimg'] } >");

この記述が「どういうソースになってブラウザに返されるか」そして「ブラウザがどういう動作をするか」を考えてみてください。img要素のsrc属性はURI(文字列)であり、ブラウザはそのURIにアクセスして画像データを取得します。なので

  1. print('<img src="imgout.php?id=$row["bid"]');

として、imgout.phpというスクリプトで($_GET['id']で)渡された商品コードから再度データを取得して

  1. header('content-type: image/jprg');
  2. print $row_rs1['bimg'];

のようにブラウザに返す必要があります。

#プライマリキーはbitemNumberじゃなくてbidでいいんですよね(斜め読みなので・・)

(参考)
  http://www.phppro.jp/qa/2375


これがあるので、画像ファイルはDBに入れずにファイルのまま置いておくのも選択肢のひとつです。


(追記@蛇足)
上記の参考URLのスレッドでも書きましたが、ブラウザにHTMLソースと画像データを一度に返すことは出来ません(何のためのcontent-typeなんだと・・)。phpのソースを書く前にHTTPの仕組みを覚えてください。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerkaitau [1月26日 11:49]

割とどうでもいい系ですが、
> ブラウザにHTMLソースと画像データを一度に返すことは出来ません
ってのは不可能じゃないですよ。
一応仕様も決まっています。
http://tools.ietf.org/html/rfc2397
実装方法に関しては
php img base64
あたりでググると良いかと。
とはいえ、置かれる画像次第で一度に読み込むHTMLの容量がアホみたく増えるし、
(上記文書内にも"could be used for a small inline image in a HTML document."
 という記述あり。何よりbase64という時点で・・・)
確かIE6あたりでは対応していないので、(IE8やFirefox3.0↑はOK)
あまりメリットは感じませんが。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
PHPのHTML埋め込み記述について
 このエントリーをはてなブックマークに追加 
A
$_POST["data"] == "男" ? $val = "checked" : $val = "" ; の意味は以下と同じです。 if($_POST["data"] == "男"){ $val = "checked; } e...

>>続きを読む

kende様のご指摘通り、三項演算子を使用する際には、コードの複雑度などを考慮する必要がありますね。書きやすさと共に可読性も追求したいところですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)