プラグイン集

無料ブログはココログ
2021年11月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

サンプルJS

  • ユーロバカ一代の締切
    ・・・初期化中・・・

« ノートPC改造第2弾 | トップページ | イロレーティング »

2012年12月 1日 (土)

画像ファイルがDBに格納出来ないよ( ;∀;)

前提、

  1. HTMLのformタグを使ってPOSTメソッドを使う。
  2. inputタグのtype=fileを使う。
  3. phpを使いPOSTで、データを受け取る
  4. DBはMySQLを使う。

ベースサイト:PHPプログラミング初心者入門講座  ※画像の取扱い無し。

参考サイト、

頑張ってサイト作る
アイ・エス・シー実験室
ウシヲシュトスル
FIREGOBY 
・・・とまぁこんな感じででいろいろ調べてみました。

パターン分析

  • file_get_contents()でファイルの内容を取得→mysql_real_escape_string()でSQLに有害な文字列をエスケープ→SQLクエリー発行
  • fopen()でうpされたファイルを開く→fread()でファイルの内容取得→addslashes()で文字列を無害化→SQLクエリー発行

でも、どっちで書いても、Invalid utf8 character string '?PNG' で画像部分が入っていかない。mysql_real_escape_string()はクライアントの文字コードの影響受けるから、mysql_set_charset("utf8");しなきゃダメとか聞いてやってみたけど、ダメだった。
mysql_client_encoding()は確かに、UTF-8に変更されるが・・・。原因はそこでは無かった。

一般的にバイナリはどうやってDBに格納するのか調査。

救世主

トモデジ MySQLでバイナリデータの扱い方

PHP+MySQLでバイナリデータをINSERTするときには、bin2hex関数などを用いて、16進数に変換してから渡します。

注意点としては、文字列ではないので ‘(シングルクォート)で囲まないこと、16進数であることを示す0xを(半角ゼロ、エックス)をbin2hexで変換した16進数の先頭に付け足すことです。

(; ・`д・´) ナ、ナンダッテー!! さっそく、bin2hex(); SQLに”0x".$img_dat;//頭に0x付けた。

動いた━━━━(゚∀゚)━━━━!!

バックエンド

phpMyAdminで見ると?pngなんちゃらでBLOBに入っている。発行したクエリみると、0x89504e470d0~と16進でクエリー発行している。
不思議に思っていたけど、気に留めてなかった。bin2hexしたら0x89504e470d0~で出てきた。phpMyAdminの結果も?pngなんちゃらで出る。
悩みまくっていたから、すごくうれしかった。

結論

JPEGはmysql_real_escape_string()やaddslashes()で行けるのかもしれないが、PNGはそうもいかなかった。
もし、PNG等のバイナリがSQL通らずInvalid utf8 character string '?PNG'がエラーって場合は試す価値が有る。

余談

"''"、ダブルコーテーション→シングルコーテーションx2→ダブルコーテーションってすごく見にくくないか?だからってバックコートとか簡便な。これ→‘‘

文字列をSQLで渡すときにエラーが出る場合は、’’を忘れてないかチェックした方がいい。私は忘れて、文法エラーで起こられた。

あと、フォームにenctype="multipart/form-data"忘れたとか、$_FILES['image']['error']にエラーフラグセットされてるとか、設定ファイルのしきい値小さすぎて、ファイルが受け取れないとか無いよな?
私ですがな・・・。

« ノートPC改造第2弾 | トップページ | イロレーティング »

プログラミング」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 画像ファイルがDBに格納出来ないよ( ;∀;):

« ノートPC改造第2弾 | トップページ | イロレーティング »