• ベストアンサー

PHPにて画像登録および検索

こんにちは。PHP4.3およびMySQL4.0、apachaを触り始めて1ヶ月ほどの初心者です。現在、良さそうな本を3冊ほど購入しましたが、題名にある、クライアント上のブラウザからMySQLへ画像を登録するシステムを想定しながら学んでいる状況です。 通常のテキストなどは登録・検索は出来るようになったのですが、本を見ても1冊は、PEARによるスクリプト(PEARの基礎は触れてない。選んだ本が間違えだったのですが…)。他の本ではディレクトリに保存のサンプルしかありませんでした。 こちらの「教えて!goo」や、他のサイトでも似たような質問がありますが、初心者の私には的を得ることが難しく、実際に動かしながら理解を深められればと、諸先輩方々のアドバイスを頂戴したく投函させて頂きました。 サンプルコードも含め、良いサイトなどご教授頂ければ幸いです。宜しくお願い致します。

  • MySQL
  • 回答数12
  • ありがとう数19

質問者が選んだベストアンサー

  • ベストアンサー
  • petit-C
  • ベストアンサー率46% (7/15)
回答No.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コマンドで---がいっぱいあるのは、たぶん、うまくデータが入っているからだと思います。

sadacha
質問者

お礼

peit-Cさま こんにちは。表示することが出来ました! 初心者の私にpetit-Cさんをはじめ、皆様方のご親切なアドバイスには本当感謝しております。 自分で学んでいくのは勿論ながら、今後、またアドバイスを頂戴したく投函させて頂くかと思いますが、その際にはまた宜しくお願い申し上げます。 有難う御座いました。

その他の回答 (11)

  • petit-C
  • ベストアンサー率46% (7/15)
回答No.11

画像のバイナリを出力するスクリプトですが、 処理の位置が間違っています。 <?php mysql_connect('localhost','root','******'); mysql_select_db('test'); $id = (int)$_GET['id']; //$sql= "select * from image where id = " . $id; $sql= "select * from image"; $result = mysql_query($sql); $rows = mysql_num_rows($result); //$img_data = base64_decode($row[1]); //←これは$row[1]が未定義 if($rows == 0){ echo "<p>該当データがありません。</p>"; }else { if($row = mysql_fetch_array($result)){ header('Content-type: image/jpeg'); //echo $row["img_data"]; //これでは、生のテキストが出ます。 $img_data = base64_decode($row["img_data"]); //ここで、データをデコードします。 echo $img_data; //表示します。 }else{ echo 'あれれ?'; } } exit; ?> header()でエラーがでるのは、たぶん、なにか、別の警告やエラーが表示されているからだと思います。 headerは、あらゆる出力の前に呼ばれる必要があります。 警告等がまだでるようなら、警告文をコピペしてください。

sadacha
質問者

お礼

petit-Cさま こんばんは、お手数お掛けし申し訳ありません。感謝しております。 ところで、お教えいただいたように登録スクリプトを変更し、コマンドプロンプト上で登録状況を確認したら画面一杯に------だけが表示が出てきました。 また、表示スクリプトですが、 下記のようなエラー?表示が出てきました。 Warning: Cannot modify header information - headers already sent by (output started at c:\home\public_html\business\login\member\saller\upload-kekka.php:9) in c:\home\public_html\business\login\member\saller\upload-kekka.php on line 54 file_get_contents 何から何までお任せしているようで恐縮しておりますが、私自身、解決に向け切欠さえ掴めない状況であるため、引き続きご指導頂ければ有難く思っております。本当に申し訳ありませんが、宜しくお願い申し上げます。

  • petit-C
  • ベストアンサー率46% (7/15)
回答No.10

登録スクリプトの $img_data = file_get_contents; //(一時ファイル名) $enc = base64_encode($img_data); のところですが、コメントアウトしている(一時ファイル名)は、file_get_contentsという関数の引き数です。 これだと、$img_data = 'file_get_contents';とおなじになります。(だから、いつも一緒のデータ) それより前で、 $img_data = fread($fp, filesize($_FILES["upfile"]["tmp_name"])); として、$img_dataにバイナリを入れているので、 file_get_contentsの行は不要です。 freadと同じことをしようとする関数です。

  • petit-C
  • ベストアンサー率46% (7/15)
回答No.9

文字化けについて 環境によりますが、文字化けしているように見えてもうまく登録されている場合があります。 MySQLに登録したり、画面表示は、たしか、EUC-JPの文字コードを使っていると思いますが、 mysqlのDB接続のクライアントは、SJISで表示しているのかもしれません。 入れるときも、表示するときもEUC-JPなら問題ないので、画像データをはずして、全件をPHPから表示したら実はうまく言っているという場合も有ります。 Windowsでやっているなら、画面表示はSJISなので、EUCベースのスクリプトは必ず文字化けします。 CSV出力して、テキストエディタで開くと読めるかもしれません。 CSVに出力(エクスポート)する方法 http://tomo.ac/goodstream/database/mysql/linux/tips.htm#%83f%81[%83^%82%F0CSV%82%C5%8Fo%97%CD%82%B7%82%E9%95%FB%96@ telnetやssh環境なら、EUC-JP→SJISに変換してくれるものもあります。 私は、PuTTy JPというのを使っていて、 EUC-JPやUTF-8のDBに接続して、Windowsで中身を見ています。

参考URL:
http://tomo.ac/goodstream/database/mysql/linux/tips.htm#%83f%81[%83^%82%F0CSV%82%C5%8Fo%97%CD%82%B7%82%E9%95%FB%96@
  • petit-C
  • ベストアンサー率46% (7/15)
回答No.8

base64を元に戻すのを書き忘れました。 戻すほうは、base64_decodeという関数を使います。 http://jp2.php.net/manual/ja/function.base64-decode.php $sql = "SELECT * FROM image"; を使って、データをとり、 $image_data = base64_decode($row[1]); としてから、 echo $image_data; とします。 これは、imgタグのsrcのターゲットのPHPスクリプトが行う動作です。 画像のバイナリデータ --base64_encode--> 文字列表現 文字列表現      --base64_decode--> 画像のバイナリデータ です。 SQLでは、文字列のほうが都合がいいので、このようにします。 アップロードされたファイルはバイナリで、表示も、バイナリでなければいけません。

sadacha
質問者

お礼

petit-C様 可笑しなところがありますが、下記(先の補足欄に表示)コードにて、コマンドプロンプト上で画像の登録が確認できました(どれも同じ文字列ですが...)。 しかし、画像表示スクリプトでは画像を認識出来ません。行き詰まっての状況報告です。改め内容を確認いたしますが、お時間のあるときにでもコードを見ていただければ幸いです。

sadacha
質問者

補足

petit-Cさま、おはよう御座います。 長文になるので、こちらの補足欄に記載いたします。 表示スクリプトですが、先日お教えいただいたスクリプトをアレンジしたのが下記のようになっておりますが、これだと画像と認識出来ない(DBに登録された文字列が表示される…適切な表現が出来ずにゴメンなさい。)ようなので、二種類用意しているのですが、もう一方では、画像と認識するものの、header('Content-type: image/jpeg')を入れると、この部分でエラー表示が出、コメントとすると、エラーは出ない状況となります。 いずれにしても画像と認識するものの、いわゆる画像が見つからないという表示(四画の中に赤いバツ印)となってしまいます。 何から何まで恐縮ですが、引き続きアドバイス頂ければ幸いに思っております。 <?php mysql_connect('localhost','root','******'); mysql_select_db('test'); $id = (int)$_GET['id']; //$sql= "select * from image where id = " . $id; $sql= "select * from image"; $result = mysql_query($sql); $rows = mysql_num_rows($result); $img_data = base64_decode($row[1]); if($rows == 0){ echo "<p>該当データがありません。</p>"; }else { if($row = mysql_fetch_array($result)){ header('Content-type: image/jpeg'); echo $row["img_data"]; //echo $img_data; }else{ echo 'あれれ?'; } } exit; ?> <?php mysql_connect('localhost','root','******'); mysql_select_db('test'); $sql= "select * from image"; $result = mysql_query($sql); $rows = mysql_num_rows($result); $img_data = base64_decode($row[1]); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ //header('Content-type: image/jpeg'); echo "<p>"; echo $row["id"]; echo "<br/>"; echo '<img src="image.php?id=' . $row["id"] . '">'; //echo $row["img_data"]; //左を上記に変更 echo $img_data; echo "<br />"; echo $row["nam"]; echo "<br />"; echo "</p><hr />"; } } ?>

  • petit-C
  • ベストアンサー率46% (7/15)
回答No.7

「画像が登録されない」という問題と、「日本語が文字化けする」というは、分けて考えてください。 画像が登録されない問題ですが、 結局いまのコードはどうなっているんでしょうね? がるさんのアドバイスを入れると、 $img_data = file_get_contents(一時ファイル名); $enc = base64_encode($img_data); $name = addslashes($_POST['name']); $sql = "INSERT INTO image VALUES (0,'$enc','$name')"; という感じでいかがでしょうか。 ちょっと、がるさんへのコメントをみると、 間違った入れ方をしているようですので。 base64は、バイナリ(abc...だけじゃない)を文字列(abcとかだけ)に変換する仕様です。変換は、基本的に、ダブルクオート内では行えませんので、変換命令は、$sqlの定義前に済ませておきます。 > $base64_decode(ata$id), は、上の $enc = base64_encode($img_data); に対応すると思います。 また、変数名を複雑にすると、$sql = ...の後の「"」のなかの変数がうまく、展開されない場合があります。 上記のように短いファイル名だとうまくいくことが多いですが、本当は、波括弧で括るのがいいようです。 PHPマニュアル:複雑な (波括弧) 構文 http://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.double

参考URL:
http://www.php.net/manual/ja/language.types.string.php#language.types.string.syntax.double
sadacha
質問者

お礼

petit-Cさん、こんばんは。 ご丁寧なアドバイスを有難う御座います。 コードですが、先日お返事させていただいてから頭を悩ませており、殆ど変わっておりません。 これからアドバイスの理解を深めながら改めてお返事いたします。引き続きアドバイスなど頂ければ幸いです。 取り急ぎご挨拶まで。。有難う御座います。

sadacha
質問者

補足

●登録スクリプト <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> <a href="http://localhost/business/login/member/saller/upload-kekka.php">内容確認</a> <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; } $img_data = fread($fp, filesize($_FILES["upfile"]["tmp_name"])); fclose($fp); print("ファイルサイズ:{$_FILES["upfile"]["size"]}<BR>\n"); $len = strlen($imgdat); print("データ長 = $len<BR>"); $img_data = file_get_contents; //(一時ファイル名) $enc = base64_encode($img_data); $name = addslashes($_POST['name']); //これを追加。$nameが、未定義なので $con = mysql_connect("localhost", "root", "******"); if (!$con) { print("MySQLへの接続に失敗しました"); exit; } if (!mysql_select_db("test")) { print("データベースへの接続に失敗しました"); exit; } $con = mysql_connect("localhost", "root", "3lc4dp4hf1"); $name = addslashes($_POST['name']); $sql = "INSERT INTO image VALUES (0,'$enc','$name')"; $result = mysql_query($sql); if (!$result) { print("SQLの実行に失敗しました<BR>"); print(mysql_errno().": ".mysql_error()."<BR>"); exit; } mysql_close($con); } ?> ●表示スクリプト <?php mysql_connect('localhost','root','******'); mysql_select_db('test'); $sql= "select * from image"; $result = mysql_query($sql); $rows = mysql_num_rows($result); $image_data = base64_decode($row[1]); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ header('Content-type: image/jpg'); echo "<p>"; echo $row["id"]; echo "<br/>"; echo '<img src="image.php?id=' . $row["id"] . '">'; echo $image_data; echo "<br />"; echo $row["nam"]; echo "<br />"; echo "</p><hr />"; } } ?>

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.6

がるです。甘えられてみます(笑 > 画像登録以外はbase64_encodeを利用しないでも問題ないということなんでしょうか? に関してですが、ちときちんと。 SQL文中に入れる文字には、「入れても問題のない文字」と「問題を引き起こす可能性がある文字」があります。 で。当然ではあるのですが「問題がある文字」はどうにかして「問題のない文字」にしていかなければなりません。 画像データというのは、中にどんなデータが入っているかわからないために、base64などできっちり処理をしないと、時々ものすごいことになります。 ただ、一方で。「問題のない文字」には、a-z、A-Z、0-9(いわゆる、英文字と数字)あたりが含まれます(他にもあるのですが、とりあえず)。で、例えばIDなどは、英文字+数字で構成されていることも多いため、その場合、別段何も処理をしなくてOK、って感じになるです。 ま、セキュリティの観点からいうと、'とか;とかはとても危険な文字なので、こういうのは「サニタイズ」とか呼ばれる処理を通して無毒化するのですが(この辺はSQL-injection関連を調べてみてください)。 というわけで、画像データ以外は、base64は(データの性質によるものの)しないこともおおい、って感じになります。 で、BLOBですが。…ちとうろ覚えなのですが、確かDBによっては使えないタイプがあったような。…ちとかなり古い記憶なので自信ないのですが。 一度、使われているDBのマニュアルと、SQL書式を調べてみるのもよいかもしれないです。 not nullが「NOと表示されない」のは、多分そんな感じの仕様なのだろうと思います。 テストで一つテーブルを作って、not null制約をつけたカラムとつけないカラムを見比べてみられるとよいかもしれません。

sadacha
質問者

お礼

がるさん、こんばんは。 甘えの対応、ありがとう御座います^^; 一言、なるほど…と考えさせられました。 書籍などにも、DBに登録された文字に悪意あるスクリプトが含まれていることを想定し、出力する際、htmlspecialchars() を使うことで、< や >、& といった記号をエンコード(?)させるのがセオリーと知らされましたが、登録する際にも必要なのですね。 ということは、ID以外(テキストフォームなど)をweb上で公開する場合などには、(がるさんが仰っていた、' や、; などを入力するのが不自然であると想定できる場合は)同じようにbase64_encodeを利用すべきという事になるのでしょうか。 BLOBの件も含めて、貴重なご意見に感謝しております!有難う御座います!

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.5

がるです。 > とありますが、これまで文字列を登録する際、 > $sql = "insert into member values(0, '$data, d', '$pass', '$comp')"; > のようにしてきましたが、 > アドバイスを盛り込む場合だと、 > $sql = "insert into member values(0, '$base64_decode(ata$id), 'base64_decode(pass), 'base64_decode(comp))"; > のようになるのでしょうか? んっと。データ以外は、base64_encodeしなくても大丈夫です(SQL-injectionのためのサニタイズは別途してあると仮定して)。 で。INSERT構文では、 INSERT INTO テーブル名 INSERT INTO テーブル名(カラム名,カラム名,カラム名) の2パターンを見ると思うのですが。「必ず」カラム名は明示してください。そうしないと、変なバグに苦しめること請け合いです。 で。それ以外の、null周りなどは、一度、例えば http://www.techscore.com/tech/sql/index.html あたりをじっくりと読むとよいかもしれません。…で、いきなり全部読むと挫折しそうな量があるので(笑 直接的には、 http://www.techscore.com/tech/sql/03_03.html の「3.4.3. NULL を締め出す制約 <NOT NULL>」をご覧くださいませ。 後は、多分今後 > 的を得た情報を得ることが中々出来ず の部分で。ぐぐる(Googleで検索する)ことに慣れて見ると、また得るものも大きいかもしれません。 とりあえず、適当なキーワードで色々と叩いてみることをお勧めいたします。 んで、またわからなくなったらお気軽にご質問くださいませ ^^

sadacha
質問者

お礼

がるさん、こんばんは。ご丁寧なアドバイスを有難う御座います!早速参考のサイトをお気に入り登録させて頂きました!後でじっくり目を通して見ます!(全部はホント挫折しそうです!笑) ところで引き続き甘えてるようで申し訳ないのですが、 >んっと。データ以外は、base64_encodeしなくても >大丈夫です(SQL-injectionのためのサニタイズは >別途してあると仮定して)。 とは、どういった意味でしょうか?画像登録以外はbase64_encodeを利用しないでも問題ないということなんでしょうか?私の認識不足からか、SQLに登録する全ての文字、画像などをデータと称しているのかと思っておりましたので…。 それと、お教えいただいたサイトにある、「3.4.3. NULL を締め出す制約 <NOT NULL>」を参考に、コマンドプロンプトからcreate table test... とやってみたのですが、BLOBに関してはエラーとなり(記述ミスでもあったかな?)、他の文字データに関しては、NULLがこれまでYESとなっていたものが、何も表示されないといった状況になっておりました。想像ではYESではなくNOと表示されるのかと思っていたので、確認の意味でも改めてアドバイスなどしていただければと思います。 何から何まですみません。。宜しくお願い致します。

  • petit-C
  • ベストアンサー率46% (7/15)
回答No.4

#1です。 $sql = "INSERT INTO image(img_data) values(0, '$imgdat', '$name')"; //$sql = "INSERT INTO image values(0, '$imgdat', '$name')"; の部分ですが、コメントアウトにしてしまっている部分のほうが正しいと思います。 それから、$nameは、未定義なので、 $name = addslashes($_POST['name']); としなければいけません。 確認スクリプトですが、画像をそのままechoしてはいけません。 echo $row["img_data"]; の部分は、 echo '<img src="image.php?id=' . $row["id"] . '">'; としてください。 そして、image.phpは、 <?php mysql_connect('localhost','root'); mysql_select_db('test'); $id = (int)$_GET['id']; $sql= "select * from image where id = " . $id; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; }else { if($row = mysql_fetch_array($result)){ header('Content-type: image/jpeg'); echo $row["img_data"]; }else{ echo 'あれれ?'; } } exit; ?> と言った感じで。 Content-typeの部分は、ひとまず、jpegにしておきました。 私も、がるさん同様、テーブルに画像のバイナリを突っ込むのあまり良くないと思います。 実際、お試しのとおり、echoできるわけではないので、特に便利とも思えません。 通常は、ファイルにしておいて、ファイル名だけ、テーブルに持っておくのではないでしょうか? 本のサンプルでもそう書いてあると思います。 それから、もし、これでもデータが入らないようなら、 PHPの設定で、アップロードができなくなっている可能性があります。 php.iniというファイルが、どこかにあるはずです。 (phpinfo.phpというスクリプトで確認できます。) その中に、Configuration File (php.ini) Pathにphp.iniの位置が、file_uploadsの項目に、 アップロードができるのか書かれています。 phpinfoが表示できないなら、safeモードが働いているので、もしかしたら、アップロードも禁止されているかもしれません。 -- phpinfo.php -- <?php phpinfo(); exit; ?> -----------------

sadacha
質問者

お礼

petit-C様 おはよう御座います。引き続きご親切な回答に感謝いたします。 >私も、がるさん同様、テーブルに画像のバイナリを >突っ込むのあまり良くないと思います。 >通常は、ファイルにしておいて、ファイル名だけ、 >テーブルに持っておくのではないでしょうか? >本のサンプルでもそう書いてあると思います。 私が持っている本では、「データベースに画像を登録するパターン」と、「ディレクトリに保存させるパターン」が紹介されておりますが、その2つともPEARでスクリプトを記述?されていることもあり、正直なところ思うよに理解を深めずにいるのが現状です。 ただ、何とか色々と調べている段階で、ディレクトリに保存させる事までは出来たのですが、アップロードさせる画面において、同時にDBにその画面を呼び出すためのファイル名?を登録させるスキルが無く、DBに直接画像を保存させた方が楽かな?といった思いから今回質問の投函をさせて頂きました。 また、DBに直接保存させることで、スキルの無いためか、登録した画像を含めた文章などの管理を一元化させるためには、「画像もDBへ」といった考えもあるので、その辺りの対処法も含め、例などをご教授頂ければ幸いです。 皆様に甘えてばかりのようですが、引き続き貴重なアド倍を頂ければ幸いです。宜しくお願い致します。

sadacha
質問者

補足

petit-C様 こんばんは。補足の欄を使用親しますが、現在の状況は昨夜ご指摘いただいたスクリプトの見直しにて、DBへ登録する事までは出来た・・・のですが、画像が登録されていません。しかも名前(登録する際、画像の名前を入れている)を日本語にすると文字化けになっております。 mysql> select * from image; +----+-----------------+--------+ | id | img_data | name | +----+-----------------+--------+ | 1 | | ・ニ・ケ・ネ | | 2 | | ・ニ・ケ・ネ | | 3 | base64_decode() | test | +----+-----------------+--------+ 今回は現状報告を兼ねての投稿ですが、今朝追加にてご質問させて頂いた内容を改めご教授頂ければ幸いです。 尚、php.iniでuploadに関する設定を確認いたしましたところ、 ; Whether to allow HTTP file uploads. file_uploads = On という設定になっておりました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.3

がるです。 まぁ…通常、趣味で作ってる分には問題がないことが多いのですが。これがお仕事だったりすると、DBのシステムがフラフラしたりすることも多いので。 そうすると、どうしても「DB固有の何かを使わないように」作成をする癖がつきまして(苦笑 バイナリデータの直接の格納はDBごとにある程度の差異が出てしまうので、あんな内容を書き込んでおります。 で、nullですが。一言で片付けると「データがない状態」になります。 で、カラムのnullの許可不許可(とか、可否とか、Yes/Noとか)は、「その場所が"データがない状態"でもいいですか?」って意味になります。 端的に、通常プライマリキーなどと呼ばれるカラムは、そこにデータがないと困ってしまうので、まず大抵「 not null 」とか書いたり、NULLを不許可(否、No)にしたりします。 逆に、許可(可、Yes)のところは「もしかしたらデータ持ってないかもしれないけど気にしないでね」って意味合いになるです。 で、影響は…組み方次第、ですねぇ。nullを許可にしてあるのであれば、selectでデータを取ってきたときに「もしかしたらデータがないかもしれない」事を念頭に入れておく必要があるです。 まぁ、基本的には、全カラム「不許可」にすることを基準に考えると、割合に楽かとは思いますが。

sadacha
質問者

お礼

がるさん、おはよう御座います。夜遅くのお返事有難う御座います。諸先輩方々のアドバイス、本当貴重なご意見と感謝しております。 ところで先日の回答に、 >$DBに突っ込める文字列 = base64_encode($画像の >バイナリデータ) >$画像のバイナリデータ = base64_decode($DBに >っ込んだ文字列) とありますが、これまで文字列を登録する際、 $sql = "insert into member values(0, '$data, d', '$pass', '$comp')"; のようにしてきましたが、 アドバイスを盛り込む場合だと、 $sql = "insert into member values(0, '$base64_decode(ata$id), 'base64_decode(pass), 'base64_decode(comp))"; のようになるのでしょうか? それと、Nullに関してですが、プロンプトからテーブルを作成する際、create table テーブル名(フィールド名 データ型, フィールド名2 データ型2, …); のようにしてまいりましたが(本ではこの方法しか掲載されていなかった)、不許可にする場合は、どのようにしたら宜しいのでしょうか? お任せと受け取れる質問ばかりで恐縮ですが、私にとって的を得た情報を得ることが中々出来ず、引き続きご教授頂ければ幸いに思っております。宜しくお願い致します。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 ちと#1以外の回答をひとつ。 DBで何が問題といって「バイナリのデータを突っ込む」と、色々と悪さをするのが問題になります。 で。「バイナリのデータを扱いやすいデータに変換する」方法がありまして。ポピュラーなものの一つに「Base64」という規約があります。 PHPでは、base64_encode、base64_decodeという関数でそれがサポートされています。 端的に書くと $DBに突っ込める文字列 = base64_encode($画像のバイナリデータ) $画像のバイナリデータ = base64_decode($DBに突っ込んだ文字列) って感じです。ただ、「DBに突っ込める文字列」は、画像サイズと比較しておおよそ1/3ほど増えるので、そのあたりだけご注意ください。 データ型としてはtextが、アバウトですが一番扱いやすいかと。 何かの参考にでもなれば幸いです。

sadacha
質問者

お礼

galluda様 はじめまして、こんばんは。 貴重なご意見を有難う御座います。まだまだ未熟者なため理解を得るには時間を要すところとは思いますが、この貴重なアドバイスに感謝いたしております。 ところで、とは言っては何ですが、(余談になるのですが)コマンドからテーブルを作成する際、 create table テーブル名(フィールド名 データ型, フィールド名2 データ型2, …); と、私の購入した本を参考にしているのですが、Nullは全てYESと表示されております。そもそもこの意味が良く分かっていないのですが、他のサイトや本では、このNullが「可」であったり「否」であったりするのを見かけます。少々前置きが長くなってしまいましたが、このNullの意味、そしてこの設定の違いの意味はどういったところに影響を与えるのかをご指導頂ければ有難く思っております。 今回の質問の趣旨に外れてしまいましたが宜しくお願い申し上げます。

関連するQ&A

  • プログラムの記述のあるPHPファイルをHTML化

    こんばんは。お世話になってます。 タイトルにあるように、PHPファイルをHTMLファイルとして別名で設置させるコードを考えているのですが、どのようにしたら良いのかが、全く分かりません。 例えば・・ ~basic.php~ <html> <head> <title></title> </head> <body> <?php //DB接続 //データ呼び出し while($row = mysql_fetch_array($result)){  ・  ・ } ?> </body> </html> という基本となるphpファイルを設置しておき、問合せ結果をhtmlファイルとして別名で保存していきたいと考えているのですが、具体的にどのようなアルゴリズム?となるのでしょうか? 本を見ながら、PEARにも挑戦してみましたが、コマンドでインストールが完了したはずですが、本や多くのサイトで紹介されているように、C:/PHP/PEAR/HTML というディレクトリが確認できずに、PEARの利用は難しいのかな?と・・。 PEARのアドバイスも頂戴出来たら幸いですが、本題の通り、上記質問のようなPHPファイルを別名でのHTMLファイルとして保存させるための流れをお教えいただければと思います。 お忙しいとは思いますが、宜しくお願い致します。。

    • ベストアンサー
    • PHP
  • PHP+MySQL 画像保存

    MySQLに画像ファイルを蓄積するためには、どうしたらいいのかわかりません。 本のデータベースを作成していますが、本のデータを登録する際に、ISBNを入力するとamazonからデータを取得して、そのデータをMySQLに蓄積するにはどうしたらいいか教えてください。サンプルっソース等・概要図(システム概要図みたいなの)があると助かります。 どなたかよろしくお願いします。

    • 締切済み
    • PHP
  • 【PHPとMySQLで登録・ログインフォームを作りたい】

    【PHPとMySQLで登録・ログインフォームを作りたい】 お世話になっております。 この度、大学の研究室のIP管理をすることになり、ホスト名を登録するフォームを作ろうと思っています。 そこで勉強も兼ねてPHPとMySQLを使って登録フォームとログインフォームを作りたいのですが中々参考になるサイトが見つからないのでよろしければサンプルや解説などがあるサイトを教えていただけると嬉しいです。 流れとしては 登録フォームでIDとパスワードを設定 ↓ ログインフォームでログイン ↓ 管理画面でホスト名を設定 で考えております。 登録フォームの作り方(PHPのフォームで文字を受け取りSQLに格納)の方法が分かれば管理画面もすぐ作れるかなと考えております。 参考になるサイトや解説サイト、サンプルサイトがあれば教えてください。お願いします。 フォームからの文字の受け取り方、SQLの格納の仕方など些細なことでもかまいません。お願いします。

    • ベストアンサー
    • PHP
  • PHPとACTION SCRIPTの連携

    PHPとACTION SCRIPTの連携 サーバー(レンタルサーバ)側でMYSQLのデータをからPHPで取り出すことができるようになりましたが、 そのデータを、どうやってaction script(クライアント側)に連携させるかで悩んでます。 phpとmysqlの連携の本は何冊かそろったのですが、 ACTION SCRIPTとphpの連携について書いてある本が見つからなくて、 詳しい人がいたら教えてください。 PHPからmysqlに接続して、テーブルを選んで、 echo $row["●●"]; という形で、インターネットエクスプローラーに、必要なデータを表示させるところまではできたのですが、 このデータをaction scriptに連携させるには、どうしたらいいでしょうか?

    • ベストアンサー
    • PHP
  • php mysqlで条件検索したいが学び方は

    http://www.asakusa-chintai.com/list.php?foot_station=-1&yachin_low=-1&yachin_hi=-1&menseki_low=-1&menseki_hi=-1&pict=1&search_start=1 このサイト(下に検索フォームがあります)のように、複数条件で検索すると画像付きで横4列くらいで結果が返ってくる、さらに20件ごとに改ページといったようなものを作りたいと考えています。 そこで質問なのですが、phpとmysqlを使うことでこのようなページ、またデータベースにデータを登録するようなシステムはできるでしょうか? phpとmysqlを勉強すればできるようになるのではと考え、phpの基礎の本は一冊読み、簡易ブログシステムを作った程度の(といってもサンプルプログラムを少しいじって動かした程度ですが)ことはしたのですが、これから何を勉強すればいいのかわからなくなりました。 特にphpやmysqlを勉強したいわけではなく、上記のようなページを作成することが目的なので、できればphpやmysqlを体系的に学ぶというよりは、上記のページを作成するために必要な技術だけ学びたいです。 これから何を学べばできるようになるでしょうか? それとも、これは相当に難しい事で、年単位で勉強しなければできないものなのでしょうか?

    • ベストアンサー
    • PHP
  • 独学でphp

    ポイント管理プログラムのようなものを作成したいと思っています。 php mysqlを独学で学びたいと思っているのですが、他にこれを覚えた方がよいなどアドバイスください。 コンピュータはほぼ初心者です。 理想は、シンプルで、高付加にも耐えることができるシステムが作りたい。そして、覚えるのが比較的簡単。 質問があいまいで申し訳ありませんが、些細なことでもよいのでアドバイスや、お勧めの本教えてください。 お願いします。 pearは役に立つのかなど。

    • 締切済み
    • PHP
  • PHP+MYSQLについて

    PHP+MYSQLについて 速効!図解プログラミング PHP+MYSQLと言うの本の中で紹介されています。PHPとMysqlで作る会員管理システムについてこの本を元にして構成を変更したく考えています。下記の内容を実現するにはどの様な変更するとうまくいくのでしょうか? 画面遷移を トップページ ⇒ 登録画面(全項目登録) ⇒ 確認画面 メール送信完了画面 メールhttp://~ ⇒ 登録完了 ⇒ ログイン を トップページ ⇒ 登録画面(メールのみの登録) ⇒ 確認画面 メール送信完了画面 メールhttp://~ ⇒ 本登録(全項目登録) ⇒ 登録録完了 ⇒ ログイン この本をお持ちの方、勉強された方どの様な作りにしたらよいと思いますか? ちなみにこの本のサンプルはhttp://book.mycom.co.jp/suport のSection72-81です。 皆様なにとぞお力をお貸しいただけます様によろしくお願いいたします。

    • 締切済み
    • PHP
  • MacOSX10.3でpearモジュールを使うには

    学習用にMacOSX10.3にもともと入っているapache,PHP,Perlを一通り使える状態に設定し、MySQLをインストールしました。MySQLも設定を一通り終えて、本を読み進めて行くと、pearモジュールを使ったサンプル制作の章に差し掛かるのですが、この本にはepar導入方法は詳しくのっておらず、つまずいてしまいました。もともとMacOSXにはpearが入っているそうですが、ネットで調べながらやってもよくわかりませんでした。とりあえず今の状況をわかる範囲で説明しますので、あとをどうすればよいか教えてください。よろしくお願いいたします。 ターミナルより which pear …これを実行すると /usr/bin/pear …と返ってきます。 cd /usr/bin …これでpearのあるであろうディレクトリへ移動 pear list …これを実行すると (no install package) …となります。 cd …とりあえずこれで最初にもどりました。 pear install PEAR …見よう見まねでこれを実行してみました。 なんかインストールされたっぽいです。 cdせずに pear list    …これを実行 (no install package) …やはりこうなります。 cd /usr/bin …再び移動 pear install PEAR …これを実行 pear list …一応実行してみる (no install package) …やっぱり といった具合です。 詳しい導入方法ご教授願います。

    • 締切済み
    • PHP
  • 画像のアップロードに関して

    お世話になっております。画像をブラウザ上からアップロードし、指定のディレクトリ(その都度mkdir関数によりディレクトリを生成)に保存するスクリプトを組んでおりますが、DBにファイル名(または保存先?)を登録するような内容を考えております。 そこでいくつか質問があり投函させて頂きます。 1・アップロードする際、クライアントのPC内にあるファイル名が日本語だった場合、そのままアップロードさせて問題が発生する事が考えられるか? 2・上記のように日本語である事を想定し、半角英数でリメイクするスクリプトを構築する場合、どのようなリメイクが適当で、どういったスクリプトを記述する事になるか? 3・アップロードさせる際、画像以外をアップロードしないよう規制をかけるにはどうしたら良いか? 4・ディレクトリに画像をアップロードさせる訳だが、後にブラウザ上にその画像を表示させるには、DBへ保存するのは、やはり<img src="…… といったコードを登録する事になるのか? の4点です。スキルが無くここ数日頭を悩ませながら、進んでは振り出しに戻るを繰り返しており、丸投げのつもりは一切無いのですが、ポイントをご指導いただければ幸いに思い、投函させて頂きました。 お手数お掛けいたしますが、ご教授のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • PHP ユーザ登録申請、メール認証ログインサンプル

    「ユーザ登録申請すると、メール認証してログインするサンプル」を探しています。 ご存知の方は教えて下さい <探している内容> ・管理者以外のユーザーが、登録申請したら、メール送信して認証 ・ユーザ情報をデータベースへ保存 <条件> ・PEARを利用していない ・XOOPS以外 ・無料 ・「CakePHP」や「symfony」などのフレームワーク(プラグイン含む)を利用していても構いません。上記要件を満たすサンプルがあれば教えてください ・なるべくメール認証機能だけがいいのですが(コードを追いやすいと思うので)、ないようなら他に機能(CMSなど)がついているものでも構いません ・なるべく日本のものがいいのですが(日本語コメントがあるとコードを追いやすいと思うので)、ないようなら外国のものでも構いません ・コードそのものを見たいのですが、ないようなら、チュートリアル的なサイトなどの情報を知りたいです

    • 締切済み
    • PHP