アプリ版:「スタンプのみでお礼する」機能のリリースについて

mysqlに画像パスを格納しておき、phpでブラウザに表示するという部分について質問があります。

以前画像を扱った際は、DBにそのまま画像データを格納していたのですが、一般的ではないということで画像パス使う方針にしました。

画像パスはthumbnailというカラムにvarcharで画像パスを格納しました。

今回ご相談させていただいた件では、主に画像の表示の部分にアドバイスをいただければと考えています。

以前画像をそのまま保存し表示するときは、get_image.phpのようなファイルを噛ませ、それをブラウザに読み込ませることで表示していたのですが、画像パスでも同じようなやり方でいいのでしょうか?

ネットで調べてみたのですが、何となくしっくりこないというか、私の誤解もあるかもしれないのですがすっきりせず迷走中です。

どうか、アドバイスをご教示いただけないでしょうか。

※以下は、試しにget_image.php噛ませてみた際のコードです。
<?php
$id = $_GET['id'];

//DB接続 ~省略~

$sql = "SELECT image FROM テーブル名 WHERE id='$id'";
$result = mysql_query($sql);
if (!$result) {
echo ("SQLの実行に失敗しました<BR>");
echo(mysql_errno().": ".mysql_error());
exit;
}
$row = mysql_fetch_array($result);
mysql_close($con);

$img_path = '$row['image']'
$img = file_get_contents($img_path);
header('Content-type: image/jpg');
echo $img;

?>

A 回答 (7件)

2再補足です。


私のソースをそのまま実行して画像が表示され、sqlから取得したパスで画像が表示されない場合はパスの問題です。
最初に書くべきでしたがブラウザのアドレスに$row['image']の中身を打ち込んで画像が表示できるか試してください(404ならパス指定、何も表示されない場合画像が壊れていると思います)

後は画像出力ファイルを書き換えてテストとなりますが
以下は実行・画像出力phpと画像フォルダ(images)が同じ場所にある前提です。(相対パスなので)

1・result.phpの$img_pathを$img_path = 'images/xxx.jpg';(相対パス&直接指定)で実行

2・Mysqlの画像パスは$row['image']にあるとして$img_path = $row['image'];となっている部分を
$img_path = mb_strstr($row['image'], 'images', FALSE);に変更し実行(相対パスに変更)
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。

アドバイス頂いたとおり、順を追って書きなおしてみることでうまく表示されるようになりました。

丁寧にアドバイスしていただきありがとうございます。

最後に一点、画像出力ファイルについてなのですが、複数の画像を扱う場合はそれぞれの画像ごとに出力ファイルを作るのが望ましいのでしょうか?それとも、ファイルはどうにか一つにまとめるのが普通なのでしょうか?

お礼日時:2013/02/16 18:11

こういうphpは使わないので想像で答えますが


画像1枚につきphp1個という意味なら、ほとんど処理が同じようなら一つしか使いません。
特殊な処理を追加するときはその処理用のファイルを作成してincludeします。

GDなどを使用して複数画像を合成やら編集するのなら…気分ですね。凄く面倒な予感がしますので
やはり機能分割したファイルをincludeになると思います
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます、参考になりました。

今回は丁寧なアドバイスをしていただき、ありがとうございました。

お礼日時:2013/02/17 00:35

no2です、自分でやる場合のサンプルソースを載せます。

ブラウザで表示するphpと画像出力用のphpの2ファイル使います。
念のため言いますが、get_iamge.php1行目は必ず<?phpで開始し、このままコピーしてください。先頭行をいじると画像が表示されなくなります。
実行し動作を確認したら、コードを読み少しずつ改良を加えていくのがベストです。

実行するphp(後でidを付加する)
<?php print '<img src="get_image.php">'; ?>

get_image.php
<?php
//mysqlやidの処理を加える
$img_path = 'http://gazo.okwave.jp/okwave/images/contents/av_ …
//サンプルがhttpなのでfopen
if(!@fopen($img_path, 'r')) $img_path = 'error.gif';
//サーバー内に画像がある場合
//if(!is_file($img_path)) $img_path = 'error.gif';
header('Content-Type: image/gif');//面倒なので決め打ち
readfile($img_path);//file_get_contentsは一旦変数に保存する
?>

この回答への補足

ご回答ありがとうございます。
わざわざコードまで書いていただきお手数おかけして申し訳ありません。

やはり、画像がリンク切れのような表示をしてしまいます。

こうなってくると、プログラム自体の問題というより、画像そのものもしくは画像のパスの問題になってくるのでしょうか。

補足日時:2013/02/15 18:45
    • good
    • 0

こんにちは。



うまくいかないとはどのようにいかないのでしょうか?
(ラーが出てるとか出ていないとか)
質問者様の思っている「うまく」がわからないので補足願います。

タグのsrcに指定しないで直接呼び出したら何が表示されていますか?
xxx.xxx/get_image.php?id=xx

おそらくget_image.phpからimages/aaa.jpgが見えないんだと思います。

ディレクトリ構成なんかもあると回答しやすいです。

この回答への補足

説明不足で申し訳ありません。
うまくいかないというのは、特段プログラムのエラーが表示されるわけでもなく、画像が表示される部分がリンク切れのようなマークが出てしまいます。

直接呼び出すというのは、本来画像が表示されてほしい場所に直接そのまま
<?php echo $row['thumbnail']; ?>
とすると、、保存しているパス(文字列)がそのまま表示されます。

現在、ローカル環境で作っていますので、ディレクトリ構成としては以下のように配置しています。

localhost/testprogram/index.php
このindex.phpと同階層にresult.phpやimagesフォルダを置き、
imagesフォルダの中に画像を置いています。

したがって、画像の場所としては、
localhost/testprogram/images/画像.jpg

といった形になります。

補足日時:2013/02/15 17:27
    • good
    • 0

こんにちは。



まずはDBから取得したパスが思い通りのものであるか出力された内容を見てください。

No2さんの指摘で気づきましたが、
$img_path = '$row['image']'とか$img_path = "$row['image']";
はエラーになりませんか?

$img_path = $row['thumbnail'];
になると思います。

またパスについては設計によりけりです。
表示するスクリプトから見た相対パスなのか、ホームディレクトリからのパスなのか、URLがすべて入っているのか。

どんな内容を保存していますか?
/images/aaa.jpg
images/aaa.jpg
www.hoge.hoge/images/aaa.jpg
aaa.jpg
等々

この回答への補足

ご回答ありがとうございます。
そうですね、

$img_path = $row['thumbnail'];
が正しいです。

保存している内容は

images/aaaa.jpg

という形を保存しています。

まずはget_image.phpにアクセスして確認しながらなのですが、うまく表示されません。

全体の設計としては、
質問文に記載したコードがget_image.phpの内容で、実際にブラウザに表示するときは、

<img src="get_image.php?~~~~
という形を取ろうと考えています。

補足日時:2013/02/15 15:13
    • good
    • 0

$img_path = '$row['image']'は可変変数?普段使わないので、こういう書き方もアリなのか判断できない自分が居ます。



直接イメージファイルを出力するのなら、file_get_contentsではなくreaderで済みます。
header("Content-type: image/jpg");
readfile("ファイルパス");

この回答への補足

質問文の中で一部記載ミスがありました。No1の回答者様の補足の欄に記載ミス・補足内容を書かせて頂きました。
これによりわかりづらい質問になってしまったことをまずお詫び致します。

今回は検索システムを想定していましたので、パスを直接書き込むというより、DBに保存したものをひっぱってくる形をとろうと考えています。

thumbnailというカラムにパスを保存しているので、ファイルパスの部分には$row['thumbnail']を入れてみているのですが、どうにも表示されません。されません。

一方で、表示したい部分に何もかませずに直接パスを書き込むときちんと表示されます。

補足日時:2013/02/14 22:49
    • good
    • 1

こんにちは。



画像の保存ディレクトリが外部から見える場所にある場合→
<img src="<?php echo $imgpath ?>">

($imgpathはデータベースより取得したパス)

外部から見える(URLでアクセスできる)場所であれば取得したパスをそのままsrcに設定すればブラウザに表示されます。

画像の保存ディレクトリが外部から見えない場所の場合→
この場合は提示されたスクリプトを画像タグで呼べば良いです。
<img src="image.php?id=5">

DBに入っているパスが外から見える場所かどうかでやりかたが変わります。

この回答への補足

ご回答ありがとうございます。
まず、質問文に一部記載ミスがありましたことをお詫び致します。

【誤記】
$img_path = "$row['image']";

正しくは、 $img_path = "$row['thumbnail']"; です。

カラムがthumbnailなので、$row['thumbnail']でなければなりませんでした。

失礼しました。


ご説明していただくことで勝手は理解することができました。

今回の件ではURLでアクセス出来る場所でしたので、例えばパスをそのままimg src="パス名"という形で入れてみるときちんと表示されました。

一方で、パスを直接書き込むのではなく、DBに格納したものをひっぱってくる形だとうまく表示されません。

これは絶対パスか相対パスかによって違ったりするのでしょうか?
DBには絶対パスを格納しています。

重ねてご質問させていただく形になりますが、是非ご教示ください。

※今回検索システムの中での画像の仕組みの部分で、$row = mysql_fetch_array($result);としているため、DBから引っ張ってくるときに$row['']となっています。

補足日時:2013/02/14 22:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています