質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.65%

ファイルアップロード処理のコードでお聞きしたい部分があります

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 340

newyee

score 151

以下のコードでお聞きしたい箇所がございます。

<?php
$ext = pathinfo($_FILES['upfile']['name']);
$perm = ['gif', 'jpg', 'jpeg', 'png'];

if ($_FILES['upfile']['error'] !== UPLOAD_ERR_OK) {
  $msg = [
    UPLOAD_ERR_INI_SIZE => 'php.iniのupload_max_filesize制限を越えています。',
    UPLOAD_ERR_FORM_SIZE => 'HTMLのMAX_FILE_SIZE 制限を越えています。',
    UPLOAD_ERR_PARTIAL => 'ファイルが一部しかアップロードされていません。',
    UPLOAD_ERR_NO_FILE => 'ファイルはアップロードされませんでした。',
    UPLOAD_ERR_NO_TMP_DIR => '一時保存フォルダが存在しません。',
    UPLOAD_ERR_CANT_WRITE => 'ディスクへの書き込みに失敗しました。',
    UPLOAD_ERR_EXTENSION => '拡張モジュールによってアップロードが中断されました。'
  ];
  $err_msg = $msg[$_FILES['upfile']['error']];
} elseif (!in_array(strtolower($ext['extension']), $perm)) {
  $err_msg = '画像以外のファイルはアップロードできません。';
} elseif (!@getimagesize($_FILES['upfile']['tmp_name'])) {
    $err_msg = 'ファイルの内容が画像ではありません。';
} else {
  $src = $_FILES['upfile']['tmp_name'];
  $dest = mb_convert_encoding($_FILES['upfile']['name'], 'SJIS-WIN', 'UTF-8');
  if (!move_uploaded_file($src, 'doc/'.$dest)) {
    $err_msg = 'アップロード処理に失敗しました。';
  }
}
if (isset($err_msg)) {
  die('<div style="color:Red;">'.$err_msg.'</div>');
}
header('Location: http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/file1.php');


上記のコードは、ファイルアップロードの処理の部分になるのですが、「$err_msg = $msg[$_FILES['upfile']['error']];」ここの部分で、 $msgには、「$_FILES['upfile']['error']]」がキーとして、入っているのですが、前の処理では、$msgには代入されていません。上記コードはPHPを学習している際に、出てきたコードなのですが、「$err_msg = $msg[$_FILES['upfile']」このような記述が可能な理由が分かりません。
どなたかご助言いただければ幸いです。よろしくお願いします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • te2ji

    2019/03/21 18:54

    このコード、危なそうなところを選んで、ぎりぎり回避してるロックな感じがするw差し支えなければ、出典が知りたいです。

    キャンセル

  • newyee

    2019/03/21 19:12

    確かに、そうですね。学習に使用するコードでも実際に動かして、検証するよう、気をつけたいと思います。
    >このコード、危なそうなところを選んで、ぎりぎり回避してるロックな感じがする
    ファイルのアップロード処理に関して学習していたのですが、もしかしたら、初心者に教える為、あえて分かりやすく書いてあるといったこともあるのかなとは思ったのですが、どうなんでしょうかね...
    僕は詳しくないので、分からないのですが...

    キャンセル

  • m.ts10806

    2019/03/21 19:25

    今までたくさん質問してきていて理解が進んでないのはそこです。
    コードは幾ら読んでも何もしてくれませんよ。

    キャンセル

回答 1

checkベストアンサー

+2

ネットで検索して、コードをコピペして使うのも学習段階では構わないと思いますが、あなたはそのコードをちゃんと検証していないですよね?

$err_msg = $msg[$_FILES['upfile']['error']];

を通は、if ($_FILES['upfile']['error'] !== UPLOAD_ERR_OK) の条件を満たすとき。
エラーになる具体的な事象は UPLOAD_ERR_FORM_SIZE => 'HTMLのMAX_FILE_SIZE 制限を越えています。', と書かれているわけですから、

MAX_FILE_SIZE で制限されている値以上の大きなファイルをアップロードしてみれば、その条件を通るわけです。(←コードが正しければ)

if ($_FILES['upfile']['error'] !== UPLOAD_ERR_OK) {
  $msg = [
    UPLOAD_ERR_INI_SIZE => 'php.iniのupload_max_filesize制限を越えています。',
    UPLOAD_ERR_FORM_SIZE => 'HTMLのMAX_FILE_SIZE 制限を越えています。',
    UPLOAD_ERR_PARTIAL => 'ファイルが一部しかアップロードされていません。',
    UPLOAD_ERR_NO_FILE => 'ファイルはアップロードされませんでした。',
    UPLOAD_ERR_NO_TMP_DIR => '一時保存フォルダが存在しません。',
    UPLOAD_ERR_CANT_WRITE => 'ディスクへの書き込みに失敗しました。',
    UPLOAD_ERR_EXTENSION => '拡張モジュールによってアップロードが中断されました。'
  ];
  $err_msg = $msg[$_FILES['upfile']['error']];
  var_dump($err_msg);
  exit;
}

こんな風にして実際に動かしてみれば、分かるはず。
どんなプログラマも当たり前にやっていることなので、「デバッグ」の技術は何よりも大切。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/21 18:40

    ご回答ありがとうございます。
    ご回答頂いた通り、アップロード可能な最大サイズ以上のファイルをアップロードしてみましたら、$err_msgに$msgに設定した、定数が格納されていました。
    次からは、検証するように気をつけたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.65%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る