- ベストアンサー
画像をDBに登録できない
- DBに画像を登録するプログラムを作成中ですが、登録できません。
- 画像のファイルサイズは問題ではないことを確認しました。
- 原因と対策を教えていただけると助かります。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
><?=変数?>をつかうためには、php.iniの設定が必要であるということは知りませんでした。どのような設定が必要なのでしょうか。 php.iniのshort_open_tagがonになっていることですが、action要素に$_SERVER['PHP_SELF'] の値が挿入されているようなので問題ないようですね。 >修正後、試しましたがやはり結果は同じです。 echo で$fileなどが表示されるようになっていませんか? 正直なところ、他にも全角スペースがないかを含め、ソースを最初から全部見直したほうがいいと思います。 その際は、php.iniの設定で、phpのエラーを画面で表示するようにしたほうがいいですね。 レンタルサーバーだと、 .htaccessが使えないと駄目ですけど。 一度、ローカルに環境を整えてそこで試してからサーバーに上げるようにしたほうがいいように思います。
その他の回答 (8)
- honoka-cha
- ベストアンサー率54% (40/73)
> INSERT INTO DBpractice (size, imgtype, width, height, imgdata ) values ( , '', 41, 50, '/9j/4AAQSkZJRgABAQAAAQABAAD ということは、sizeとimgtypeにまともな値が入っていないことからクエリーエラーがおきているのでしょう。 sizeについて: > $size = $_FILES["userfile']['size"];//サイズ 囲み記号において"と'が混在しているので統一しましょう。 $size = $_FILES["userfile"]["size"];//サイズ imgtypeについて: > $type = $_FILES["userfile"]["type"];// MIME型 これに値が入らないのが不思議ですね。わかりません。 ただ、とりあえず私だったら以下のようにするかな。 1. アップロード前のファイルが本当に画像ファイルか 2. アップロード前のファイル名において画像らしい拡張子がついているか 3. プログラム処理において、例えば想定するMIMEがimage/gifとimage/jpegなら、 $typeがそれらと等しいか確認してどれとも一致しなければ、エラーなどを表示し、 クエリ(insert ...)には進まないようにする
お礼
ご回答ありがとうございます。無事、解決いたしました。 いただいたアドバイスは次回以降の参考にさせていただきます。 ありがとうございました。
- shaka001
- ベストアンサー率60% (23/38)
上記HTML部分をコピーして、$fileなどを表示させてみましたが問題ありませんでした。 初歩的なところではありますが、上記ソースでは$fileなどの変数と=の間が全角スペースになっていますが 実際は半角スペースですよね? また、formタグのaction要素の部分を<?=変数?>としていますが、php.iniの設定はしてあるんですよね? 画面で、ソースの表示をした際のaction要素はどうなっているでしょうか?
補足
ご指摘箇所の半角スペースは気付いていませんでした。 修正後、試しましたがやはり結果は同じです。 <?=変数?>の部分は、ソース上では、以下のようになっています。この状態は正しいのでしょうか。 action="/XXXXX/upload.php ※XXXXはupload.phpが入っているフォルダ名 <?=変数?>をつかうためには、php.iniの設定が必要であるということは知りませんでした。どのような設定が必要なのでしょうか。 もし参考サイトなどがあれば教えてください。(現在、自分でも調査中ですが、よさそうなサイトを見つけることがまだできていません。) ちなみに環境は、サクラインターネットを使用しています。 ※プログラミング初心者のため、基本的事項がよくわかっておらずご迷惑をおかけし、申し訳ありません。よろしくお願いいたします。
- shaka001
- ベストアンサー率60% (23/38)
$_FILES["userfile"]["error"] の値はどうなっていますか? 1 ならばアップロードできるファイルサイズオーバーしています。 サイズが1MB以下のファイルで試してみてください。 アップロードできるファイルサイズを増やしたければphp.iniを修正してください。
補足
帰ってきた値は0でした。0 ということはファイルのアップロードは成功している ということを調べたのですが、やはりDBのテーブルには該当するデータは見当たりません。 何かもっと根本的なところで間違いをしているのでしょうか?
- shaka001
- ベストアンサー率60% (23/38)
$size = $_FILES["userfile']['size"]; とありますが $size = $_FILES["userfile"]["size"]; ではないでしょうか。 SQL文も$sizeの部分がおかしいようですし。 ちなみに、 '/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcH・・・・・・・・・ というのは、ファイルの内容なので問題ないかと思います。
補足
情報が前後してしまい、申し訳ありません。 さきほど、ご指摘部分も修正後 echo $strsql;を実行したところ上記のエラーとなりました。 サイズの部分がおかしいということは、やはりファイルの容量の問題なのでしょうか?? 何か他に原因がわかりますでしょうか??
- shaka001
- ベストアンサー率60% (23/38)
SQL文の構文が間違ってるというエラーのようですね。 $strsql を echo で表示するとどうなりますか?
補足
ありがとうございます。 echo をしたところ、以下のようなエラーが出ました。 width, height以外がうまく取得できていないように思えるのですが、取得部分が何かおかしいのでしょうか?? INSERT INTO DBpractice (size, imgtype, width, height, imgdata ) values ( , '', 41, 50, '/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcH・・・・・・・・・
- LancerVII
- ベストアンサー率51% (1060/2054)
こんにちは。 if ( $_POST['submit'] == 'upload' ) { } この条件がtrueにならないと思いますがいかがでしょうか。 <input type="submit" name="submit" value="アップロード"> という指定であれば$_POST['submit']の中身は"アップロード"になるはずです。 if ( $_POST['submit'] == 'アップロード' ) { } にするか if ( $_POST['act'] == 'upload' ) { } にしないとifの中は実行されないと思います。 なので、エラーメッセージも、画像の情報も表示されないんだと思います。
補足
ご回答 ありがとうございます。 おっしゃられる通り、valueとの整合性がおかしいですね。。 if ( $_POST['act'] == 'upload' ) { } に修正しましたところ、今度は以下のエラーがでました。 最後の方に'41''50'とあるのは、サイズのことをさしているのではないかと推測していますが、解決できずに困っています。解決策がおわかりであればご教授ください。 よろしくお願いいたします。 /var/tmp/phpkWq15A/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAMgApAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A8X05d91AvrKBX03arizhHpGv8q+aNGBbU7JfWdf5ive9e8VWnh2yjVl865ZAViBxgepPYVPUpbEfjaTy/Dd6en7lh+fFfPjNyx9q7bW/iBqOuafLaS2kKQzNs3pnIAIOOvtXFzwPASH6HgGqEyKQ/uPq1VqssoKAHoKZsWgRp6Ef+JzY56CZSfzFd14ftJvG+uXLynEbMXlc8lVPAUfQcVyHh+ylj8Q2Cyxnb5g57V6R8MNPcaRc30Usar553KUycKPXt1rKpLljdGtGPNKzNvVfhxo0ekxpCjRNGdysGySfUjvXlGrWKu9xEAN8WQQOzCvoSS1N7Krfa2i+X5olwA/HfPWvCviFatpfimaSDKpcqGwP7w4NZ0ZO9jbEU0lzJHEk4pMikk4kIYYJ5wabj2NdJyHWHUbeby/IZQ0a8sQR2rb8AeI006aXSpW2pdf6ts8CTpg/Xiti0+F2bC71KOeaG22u0Nve2xSY7c4zyMZ/lXm9xC6mS5UbFEgA29s5PH5Vk43umaqTjaSPpJXYWokkV4o1XLF8cn/CvHfiJOb3WUWKMsY0yFA7npn04qno/i7X7mQJPfvNBEuAJADg9j9frU0snmM0rNvcnLbuc0UqLUrsurXUlZHF3kF1Ko8+LDoPvHGSP61Q8lvQ/lXa3G0g8ZB9azvs0f8AdX8hXQ4nNc+lYXabTJhKxkG0jDnNfNuvxpFfTpGioodgAowOpoorlpm09iTRwBZEjuxq7k5PNFFdcdjFkM33B+NV6KKoR//ZYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' '', 41, 50, '/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2' at line 1
- honoka-cha
- ベストアンサー率54% (40/73)
> 現在、DBに画像を登録するプログラムを作成しているのですが、登録できません。 どうやって登録できないことがわかりましたか。 私の過去の失敗では、実は登録出来ていたけど取り出し方が間違っていたというのがありました。 > $file = $_FILES["userfile"]["name"];// 元のファイル名 > $type = $_FILES["userfile"]["type"];// MIME型 > $tmpname = $_FILES["userfile"]["tmp_name"];// テンポラリファイル名 > $size = $_FILES["userfile']['size"];//サイズ > list($width, $height) = getimagesize($tmpname); > $contents = file_get_contents($tmpname); > $res = mysql_query($strsql,$conn); これらの値が真または適切(そう)な値であるか、echoで確認してみましょう。 > print mysql_error($conn); これでどんなメッセージが表示されましたか。それを公開しましょう。 もしエラーメッセージが無いのなら、繰り返しになりますが、登録は出来ているのかもしれません。
補足
登録できていないということは、実際のテーブルに何の値も入っていないことから確認しているのですが、何か間違っているでしょうか。 print mysql_error($conn); では何のメッセージも表示されず、また以下を格納の前に行ってみましたが何の表示もされませんでした。(書き方や場所などが間違っているのでしょうか、、、) echo $file; echo $type; echo $tmpname; echo $size; echo $contents; ちなみに、ブラウザ画面上の動きとしては、アップロードボタンを押すと、「ファイルが選択されていません」という状態に戻ってしまう状況です。
- bm_hiro
- ベストアンサー率51% (200/388)
> DBのフィールド名なども正しいことを確認しています。 フィールドの型は どうなってますか? 1.5Mって大概デカいかと思いますが。 とりあえず、試しに longblob とかにしてみてはどうでしょう。
補足
ご回答ありがとうございます。 フィールド型はblob型でしたので、longblobで試してみましたがやはり無理でした。。 .gifや.jpgなど拡張子も変えてみたりしてみたのですが同じでした。 何か他に原因はありますでしょうか?
お礼
あれからスペースを確認したり、色々と思考錯誤した結果なんとか登録することができました。昨日反映されていなかったデータが今日になってDBに反映されていたりと、正直どこが決定的なミスだったのか自分でもよくわからないのですが、解決できてよかったです。 有益なアドバイスを沢山いただきありがとうございました。