- ベストアンサー
PHPにて画像登録および検索
こんにちは。PHP4.3およびMySQL4.0、apachaを触り始めて1ヶ月ほどの初心者です。現在、良さそうな本を3冊ほど購入しましたが、題名にある、クライアント上のブラウザからMySQLへ画像を登録するシステムを想定しながら学んでいる状況です。 通常のテキストなどは登録・検索は出来るようになったのですが、本を見ても1冊は、PEARによるスクリプト(PEARの基礎は触れてない。選んだ本が間違えだったのですが…)。他の本ではディレクトリに保存のサンプルしかありませんでした。 こちらの「教えて!goo」や、他のサイトでも似たような質問がありますが、初心者の私には的を得ることが難しく、実際に動かしながら理解を深められればと、諸先輩方々のアドバイスを頂戴したく投函させて頂きました。 サンプルコードも含め、良いサイトなどご教授頂ければ幸いです。宜しくお願い致します。
- みんなの回答 (12)
- 専門家の回答
質問者が選んだベストアンサー
表示スクリプト(2)がおかしいです。 画像ファイルは、バイナリ形式で、HTMLとは違いますので、 表示方法、というか、出力方法が違います。 HTMLを作るとき、画像は、<img src=...と入れますよね。 srcの先は、HTMLやテキスト形式ではないファイルで、たとえば、テキストエディタなどで開けません。 FORMで、アップロードをかけるのは、このためです。 画像をPHPで出力する場合は、HTTPヘッダーと実際の画像のデータ以外は、出力しません。 したがって、PHPファイルは、 <?php から、必ず始まり、「?>」で閉じる前に、 exit; してしまうのが、一般的です。 表示スクリプト(2)の場合、<?php ~ ?>以外の場所はすべて削除してください。 ちなみに、Warning: Cannot modify header informationというのは、header()というHTTPヘッダを出力する関数の前に、<!doctype...という出力があるせいで発生する警告です。<?phpの前を消して、エラーがなくなれば、この警告は消えます。 それから、mysqlコマンドで---がいっぱいあるのは、たぶん、うまくデータが入っているからだと思います。
その他の回答 (11)
- petit-C
- ベストアンサー率46% (7/15)
登録 ・BLOB型、もしくは、MEDIUMBLOB型などのカラムを準備 (MySQLのBLOBはバイナリを入れるもの) ・filegetcontentsなどで、バイナリを取得 (一時ファイルの退避をしないで、変数に入れる) ・バイナリをaddslashesして、insert文に入れる('でクオートして) (文字列だと思って挿入) 表示 ・<img src="image.php..でなどでHTMLからリンク (直接叩いてもいけますが。) ・image.phpでContent-type: image/jpegとか出力 (gifやpngかも知れませんが。) ・image.phpでSELECTして、カラムの内容をそのまま表示 (そのままprintやechoです。) 表示のときに、勝手にmb_convert_encodingがかかる場合があるので、while(@ob_end_clean());とかかけてください。
お礼
petit-C様 はじめまして、こんばんは。ご親切な回答を有難う御座います。お恥ずかしながら、お教えいただいたサイトを参考に、下記のようなスクリプト(画像の他に文章を登録)を設置してみましたが、上手く登録することはが出来ません。 ちなみに… DB名:test テーブル名:image 各フィールドは:id(int),img_data(BLOB),name(char) となっています。 引き続きご指導、ご指摘など伺えたら幸いです。
補足
**登録スクリプト** <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <TITLE>データベースへの画像の格納</TITLE> </HEAD> <body> <P>ファイルのアップロード</P> <FORM method="POST" enctype="multipart/form-data" action="<?echo $PHP_SELF;?>" <INPUT type="hidden" name="MAX_FILE_SIZE" value="65536"> 画像のファイル名を入力してください(最大64KByte)<br> <INPUT size="30" type="file" name="upfile"><BR> <input type="text" name="name" value="<?=$_POST['name']?>" size="18"> <BR> <INPUT type="submit" name="submit" value="送信"> <INPUT type="reset" name="reset" value="リセット"> </FORM> <br><br> <?php if ($_POST["submit"]!="") { if ($_FILES["upfile"]["tmp_name"]=="none") { print("ファイルのアップロードができませんでした。<BR>\n"); exit; } $fp = fopen($_FILES["upfile"]["tmp_name"], "rb"); if(!$fp) { print("アップロードしたファイルを開けませんでした"); exit; } $imgdat = fread($fp, filesize($_FILES["upfile"]["tmp_name"])); fclose($fp); print("ファイルサイズ:{$_FILES["upfile"]["size"]}<BR>\n"); $len = strlen($imgdat); print("データ長 = $len<BR>"); $imgdat = addslashes($imgdat); $con = mysql_connect("localhost", "root", "******"); if (!$con) { print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("test")) { print("データベースへの接続に失敗しました"); exit; } $sql = "INSERT INTO image(img_data) values(0, '$imgdat', '$name')"; //$sql = "INSERT INTO image values(0, '$imgdat', '$name')"; $result = mysql_query($sql); if (!$result) { print("SQLの実行に失敗しました<BR>"); print(mysql_errno().": ".mysql_error()."<BR>"); exit; } mysql_close($con); } ?> </BODY> </HTML> **確認スクリプト** <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>確認</title> </head> <body> <?php mysql_connect('localhost','root','******'); mysql_select_db('test'); $sql= "select * from image"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["id"]; echo "<br/>"; echo $row["img_data"]; echo "<br />"; echo $row["name"]; echo "<br />"; echo "</p><hr />"; } } ?> </body> </html>
- 1
- 2
お礼
peit-Cさま こんにちは。表示することが出来ました! 初心者の私にpetit-Cさんをはじめ、皆様方のご親切なアドバイスには本当感謝しております。 自分で学んでいくのは勿論ながら、今後、またアドバイスを頂戴したく投函させて頂くかと思いますが、その際にはまた宜しくお願い申し上げます。 有難う御座いました。