セッションを利用してデータベースにデータを登録するプログラムを作成しており、
画像のアップロード部分の処理で困っております。
画像がある場合は画像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')の文字列がデータベースに登録されてしまいます。
No.1ベストアンサー
- 回答日時:
ファイルが選択されていなくてもフォームから
<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
ご回答ありがとうございます!
$_FILESに['error']要素があったのですね。
無事に解決しました。
その他、色々とご教示いただきましてありがとうございます!
とても参考になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
透過PNGが透過されない!!
-
ドラッグアンドドロップで画像...
-
VBSの「MsgBox」について
-
Androidで画像をサーバーから取...
-
PHPで吐き出した画像にリンクを...
-
VBAでJPGサイズ変更
-
拡張子php画像をjpg画像等に変...
-
PHPで画像アップロード時にサイ...
-
Illustratorで文字と画像を流し...
-
ImageTTFTextで保存すると文字...
-
C# Excelファイルへの画像挿入。
-
画像の読み込みが遅いサイトと...
-
ファイルアップロード
-
GDを使って画像の背景を透過さ...
-
画像の解像度を落とすプログラム
-
ListViewコントロールでサムネ...
-
onedrive にexcelファイルをア...
-
MySQLのベースに書かれたプログ...
-
フォントの色を変えるには?
-
トランザクションが原因?DBに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
透過PNGが透過されない!!
-
VBSの「MsgBox」について
-
拡張子php画像をjpg画像等に変...
-
VBAでJPGサイズ変更
-
SQLiteに画像を格納したい
-
Illustratorで文字と画像を流し...
-
PHP MySQLに画像を直接保存
-
C# Excelファイルへの画像挿入。
-
ListViewコントロールでサムネ...
-
OpenGLで描いて画像ファイル出力
-
PHPで吐き出した画像にリンクを...
-
PythonのTkinter詳しい方へ。画...
-
ビットマップ画像を読み込むプ...
-
C#とJavaで、MP3タグの画像を表...
-
アップロード画像数でCSSを分け...
-
php,mysqlにて画像パス保存/表...
-
【PHP】画像が表示されず「×」...
-
手作業で埋め込んだ、UserForm1...
-
move_uploaded_fileのエラーについ
-
画像処理について
おすすめ情報