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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

393閲覧

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

newyee

総合スコア213

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/03/21 08:54

編集2019/03/21 08:55

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

php

1<?php 2$ext = pathinfo($_FILES['upfile']['name']); 3$perm = ['gif', 'jpg', 'jpeg', 'png']; 4 5if ($_FILES['upfile']['error'] !== UPLOAD_ERR_OK) { 6 $msg = [ 7 UPLOAD_ERR_INI_SIZE => 'php.iniのupload_max_filesize制限を越えています。', 8 UPLOAD_ERR_FORM_SIZE => 'HTMLのMAX_FILE_SIZE 制限を越えています。', 9 UPLOAD_ERR_PARTIAL => 'ファイルが一部しかアップロードされていません。', 10 UPLOAD_ERR_NO_FILE => 'ファイルはアップロードされませんでした。', 11 UPLOAD_ERR_NO_TMP_DIR => '一時保存フォルダが存在しません。', 12 UPLOAD_ERR_CANT_WRITE => 'ディスクへの書き込みに失敗しました。', 13 UPLOAD_ERR_EXTENSION => '拡張モジュールによってアップロードが中断されました。' 14 ]; 15 $err_msg = $msg[$_FILES['upfile']['error']]; 16} elseif (!in_array(strtolower($ext['extension']), $perm)) { 17 $err_msg = '画像以外のファイルはアップロードできません。'; 18} elseif (!@getimagesize($_FILES['upfile']['tmp_name'])) { 19 $err_msg = 'ファイルの内容が画像ではありません。'; 20} else { 21 $src = $_FILES['upfile']['tmp_name']; 22 $dest = mb_convert_encoding($_FILES['upfile']['name'], 'SJIS-WIN', 'UTF-8'); 23 if (!move_uploaded_file($src, 'doc/'.$dest)) { 24 $err_msg = 'アップロード処理に失敗しました。'; 25 } 26} 27if (isset($err_msg)) { 28 die('<div style="color:Red;">'.$err_msg.'</div>'); 29} 30header('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']」このような記述が可能な理由が分かりません。
どなたかご助言いただければ幸いです。よろしくお願いします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/03/21 09:09 編集

PHPマニュアルの出番ですね。 というか、きちんとコード読めば分かりますね。それぞれが何してるか。$msg すぐそこにあるのに。
m.ts10806

2019/03/21 09:03

ただ、そもそもがどこで紹介してるコードか知りたいですね。参考にすべきコードではないです。
newyee

2019/03/21 09:43

そもそも、配列のキーに、変数などを指定できることを分かっていませんでした...一からやり直したんですけどね...まだまだ学習が足りてないと、思わされました。
m.ts10806

2019/03/21 09:47

学習ではないですね。実動。実際に動かしてみること。今回もきちんと動かしてデバッグしてたらわかってたこと。 机上で分かるようになるのは上級者になってからです。回答者ですら質問に提示されたコードを動かしてデバッグして回答してます。コードだけ見て回答することはないです。 回答者ですらきちんと動作確認してから回答するのですから、初心者がやらない理由はありませんよね。 野球するとして、本を読んだだけでヒット打てるようになりますか?
m.ts10806

2019/03/21 09:48

いずれにしても変数の使い方、配列の使い方から色んなミニマムコード組んでやり直してください。組んで動かしてエラー出て調べて調整して。繰り返さないとなにも身に付きませんよ。
退会済みユーザー

退会済みユーザー

2019/03/21 09:54

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

2019/03/21 10:12

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

2019/03/21 10:25

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

回答1

0

ベストアンサー

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

php

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

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

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

php

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

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

投稿2019/03/21 09:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2019/03/21 09:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問