if文と例外処理(try, catch)の違いがわかりません。
画像投稿サイトを作っていて、アップロードされたファイルのバリデーションを
どうすべきか調べていたところ、例外処理をみかけて思いました。
私は①のようなコードを書いていたのですが、例えば②を私のようにtry, catchを使わず
①のように$errs[]に入れた としてなにか違いはあるのでしょうか?
PHP
1① 2if(a){ 3バリデーション 4だめなら$errs['a']にエラーメッセージを入れる 5} 6if(b){ 7バリデーション 8だめなら$errs['b']にエラーメッセージを入れる 9} 10if(c){ 11バリデーション 12だめなら$errs['c']にエラーメッセージを入れる 13} 14・ 15・ 16・ 17 18if(empty($errs)){ 19本番の処理 20} 21 22② 23try { 24 25 // 未定義である・複数ファイルである・$_FILES Corruption 攻撃を受けた 26 // どれかに該当していれば不正なパラメータとして処理する 27 if (!isset($_FILES['upfile']['error']) || !is_int($_FILES['upfile']['error'])) { 28 throw new RuntimeException('パラメータが不正です'); 29 } 30 31 // $_FILES['upfile']['error'] の値を確認 32 switch ($_FILES['upfile']['error']) { 33 case UPLOAD_ERR_OK: // OK 34 break; 35 case UPLOAD_ERR_NO_FILE: // ファイル未選択 36 throw new RuntimeException('ファイルが選択されていません'); 37 case UPLOAD_ERR_INI_SIZE: // php.ini定義の最大サイズ超過 38 case UPLOAD_ERR_FORM_SIZE: // フォーム定義の最大サイズ超過 (設定した場合のみ) 39 throw new RuntimeException('ファイルサイズが大きすぎます'); 40 default: 41 throw new RuntimeException('その他のエラーが発生しました'); 42 } 43 44 // ここで定義するサイズ上限のオーバーチェック 45 // (必要がある場合のみ) 46 if ($_FILES['upfile']['size'] > 1000000) { 47 throw new RuntimeException('ファイルサイズが大きすぎます'); 48 } 49 50 // $_FILES['upfile']['mime']の値はブラウザ側で偽装可能なので 51 // MIMEタイプに対応する拡張子を自前で取得する 52 if (!$ext = array_search( 53 mime_content_type($_FILES['upfile']['tmp_name']), 54 array( 55 'gif' => 'image/gif', 56 'jpg' => 'image/jpeg', 57 'png' => 'image/png', 58 ), 59 true 60 )) { 61 throw new RuntimeException('ファイル形式が不正です'); 62 } 63 64 // ファイルデータからSHA-1ハッシュを取ってファイル名を決定し,保存する 65 if (!move_uploaded_file( 66 $_FILES['upfile']['tmp_name'], 67 $path = sprintf('./uploads/%s.%s', 68 sha1_file($_FILES['upfile']['tmp_name']), 69 $ext 70 ) 71 )) { 72 throw new RuntimeException('ファイル保存時にエラーが発生しました'); 73 } 74 75 // ファイルのパーミッションを確実に0644に設定する 76 chmod($path, 0644); 77 78 echo 'ファイルは正常にアップロードされました'; 79 80} catch (RuntimeException $e) { 81 82 echo $e->getMessage(); 83 84} 85 86https://qiita.com/mpyw/items/939964377766a54d4682#%E7%94%BB%E5%83%8F%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E5%87%A6%E7%90%86%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E9%9B%86 87より引用

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/03 04:58