- ベストアンサー
セッションを利用したファイルの受け渡し
- セッションを利用してデータベースにデータを登録するプログラムを作成しており、画像のアップロード部分の処理で困っています。
- 問題点として、画像がある場合は画像URLを登録し、ない場合は空にしたいのですが、パターン1ではどちらの場合でも「写真のアップロードはありません」となりデータベースへの登録も空となります。
- 一方、パターン2では、画像がある場合は正常に表示されデータベースに登録できますが、画像がない場合は表示される部分の文字列がデータベースに登録されてしまいます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ファイルが選択されていなくてもフォームから <input name="upfile" type="file" /> が送信されれば $_FILES['upfile'] は必ず存在しています。 選択されていないときは $_FILES['upfile']['error'] の値が 「UPLOAD_ERR_NO_FILE」(int 4) になるだけです。 http://www.php.net/manual/ja/features.file-upload.errors.php それを含め、既存のコードではあまりにもエラーチェック処理が甘すぎます。 下記の処理を理想にコーディングしてください。 (1) isset($_FILE['upfile']) でupfileが送信されているかどうかチェック。 フォームにupfileが含まれているかどうかを見るだけで、 ファイルが選択されているかどうかは関係ない。 (2) !is_array($_FILE['upfile']['error']) で配列で送信されていないかチェック。 <input name="upfile[]" type="file" /> のように改変されたフォームで送信されたときに配列になってしまい、 想定外の挙動を示す恐れがあるため。 (3) $_FILE['upfile']['error'] の値をチェック。 (上記URLで述べた定数が該当) (4) getimagesize($_FILE['upfile']['tmp_name']) がFALSEでないか、 またそれが配列(正常時)である場合要素「mime」の値が 「image/png」「image/gif」「image/jpeg」のどれかに該当しているかチェック。 上記のフローはこちらで詳しく説明しています。 http://qiita.com/mpyw/items/939964377766a54d4682 http://qiita.com/mpyw/items/73ee77a9535cc65eff1e 【その他】 1. header関数の後にexit命令を入れないとそのままコードが実行されてしまいます。 2. 「入力」「確認」「実行」 を3ファイルで分けてheader関数で飛ばしてコントロールしている場合、 バリデーション処理は 「確認」 だけでなく 「確認」「実行」 の両方で行う必要があります。 「実行」に直接リクエストを送られる可能性も想定してください。 個人的には、画像アップロードが絡んでくるのに わざわざ「確認」ページを作るメリットがあるのか疑問に思いますね・・・ バリデーションを楽にしたいならばファイルをまとめちゃうという手法もあります。 http://bloggdgd.blog28.fc2.com/blog-entry-289.html
その他の回答 (1)
- hogehoge78
- ベストアンサー率80% (433/539)
もしかして、formタグに、「enctype="multipart/form-data"」属性を入れ忘れてませんか?
お礼
enctypeは何とか入れておりました。 無事に解決しました。 ご回答ありがとうございました!
お礼
ご回答ありがとうございます! $_FILESに['error']要素があったのですね。 無事に解決しました。 その他、色々とご教示いただきましてありがとうございます! とても参考になりました。