• ベストアンサー

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

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

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

  • ベストアンサー
  • 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