dポイントプレゼントキャンペーン実施中!

セッションを利用してデータベースにデータを登録するプログラムを作成しており、
画像のアップロード部分の処理で困っております。
画像がある場合は画像URLを登録、ない場合は空にしたいのですが、
下記のソースの問題点や解決策がお分かりになる方、ぜひご教示ください。


■submit.php



if(empty($error)){

if(isset($_FILES)){
$image = date('YmdHis') . $_FILES['image']['name'];
move_uploaded_file($_FILES['image']['tmp_name'], 'picture/' . $image);
//パターン1 $_SESSION['image'] = $image;
}
//パターン2 $_SESSION['image'] = $image;

header('Location: check.php');
}


<input type="file" id="image" name="image" />
<input type="submit" value="確認する" />




■check.php

if(isset($_SESSION['image'])){
echo '<img src="picture/' . $_SESSION['image'] . '" />';
} else {
echo '写真のアップロードはありません。';
}


<input type="submit" value="登録する" />



パターン1の場合
画像があっても無くても、「写真のアップロードはありません。」となりデータベースへの登録も空となります。

パターン2の場合
画像がある場合は、正常に「date('YmdHis')[imageの名前].jpg」が表示されデータベースに登録できます。
画像がない場合、check.php上では、<img src="picture/[date('YmdHis')の部分]のみ" />で表示され、date('YmdHis')の文字列がデータベースに登録されてしまいます。

A 回答 (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-uploa …

それを含め、既存のコードではあまりにもエラーチェック処理が甘すぎます。
下記の処理を理想にコーディングしてください。

(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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

$_FILESに['error']要素があったのですね。
無事に解決しました。

その他、色々とご教示いただきましてありがとうございます!
とても参考になりました。

お礼日時:2013/10/25 02:10

もしかして、formタグに、「enctype="multipart/form-data"」属性を入れ忘れてませんか?

    • good
    • 0
この回答へのお礼

enctypeは何とか入れておりました。

無事に解決しました。
ご回答ありがとうございました!

お礼日時:2013/10/25 02:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!