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

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

ただいまの
回答率

89.52%

Undefined variable: _FILES と表示される原因

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,151

mashu15_2

score 6

こんにちは。
現在画像投稿サイトを作成しています。
以下のエラーが出てしまい、原因が分からず困っています。

よろしくお願い致します。

発生している問題・エラーメッセージ

Notice: Undefined variable: _FILES in F:\xampp\htdocs\xampp\exFinal\exFinal_home.php on line 107
Notice:  Undefined variable: _FILES in F:\xampp\htdocs\xampp\exFinal\exFinal_home.php on line 199

該当のソースコード

<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="UTF-8">
  <title>exFinal.php</title>
  <link href="exFinal_style01.css" rel="stylesheet" type="text/css">
</head>

<body>
  <a href="exFinal_logout.php">ログアウト</a>
  <a href="exFinal_paint.html" target="_blank">お絵かき</a>

  <?php
  // ■■■■■■■■■■■■ セッション管理等ログインに関する処理  ■■■■■■■■■■■■ //

  ini_set('display_errors', 1); // エラーの表示を試みるための設定。なくてもOK。
  session_start();

  if(isset($_SESSION['name'])){  // $_SESSION['name']に値がセットされている場合...
    $userName = $_SESSION['name'];
  }
  elseif(isset($_POST['user_name'])){  // $_POST['user_name']に値がセットされている場合...
    if($_POST['user_name']==''){  // $_POST['user_name']が空文字であれば...
      $userName = '名無しさん';
    }
    else{  // $_POST['user_name']が空文字でなければ...
      $userName = $_POST['user_name'];
    }
  }
  else{
    $userName = '不正アクセス';
  }

  if(isset($_SESSION['id'])){  // $_SESSION['id']に値がセットされている場合...
    $userID = $_SESSION['id'];
  }
  elseif(isset($_POST['user_id'])){  // $_POST['id']に値がセットされている場合...
    $userID = $_POST['user_id'];
  }
  else{
    $userID = '不正アクセス';
  }


  if(isset($_SESSION['gender'])){  // $_SESSION['gender']に値がセットされている場合...
    $usergender = $_SESSION['gender'];
  }
  elseif(isset($_POST['usergender'])){  // $_POST['gender']に値がセットされている場合...
    $usergender = $_POST['usergender'];
  }
  else{
    $usergender = '女';
  }

  if(isset($_SESSION['ongender'])){  // $_SESSION['ongender']に値がセットされている場合...
    $onusergender = $_SESSION['ongender'];
  }
  elseif(isset($_POST['onusergender'])){  // $_POST['gender']に値がセットされている場合...
    $onusergender = $_POST['onusergender'];
  }
  else{
    $onusergender = '男';
  }



  $_SESSION['name'] = $userName;  //$_SESSIONにデータを保存
  $_SESSION['id'] = $userID;
  $_SESSION['gender'] = $usergender;
  $_SESSION['ongender'] = $onusergender;





  // ■■■■■■■■■■■■ データ入力に関する処理  ■■■■■■■■■■■■ //

  print '<p>氏名:' . $userName . ' 学籍番号:' . $userID .   ' 性別:' . $usergender .'</p>';

  print '<form action="#" method="post" enctype="multipart/form-data">';
  print '<input type="hidden" name="max_file_size" value="1048576">';
  print '<p>画像ファイル:<input type="file" name="user_file"></p>';
  print '<p>1行コメント:<input type="text" name="user_comment" size="50"></p>';
  print '<p><input type="submit" value="送信"></p>';
  print '</form>';

  $dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8"; // Data Sourse Name:接続のための情報をまとめた文字列

  try {
    $pdo = new PDO($dsn, $db_user,$db_pass); // Php Data Object:PHPからデータベースに接続するためのクラス
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //エラーモードを例外処理タイプに設定
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //プリペアドステートメント利用のためエミュレートを無効にする
    print 'データベースに接続しました。<br>';
  } catch(PDOException $Exception) {
    die('エラーですな... :' . $Exception->getMessage()); // エラーが生じた際の例外処理
  }

**if($_FILES && $_POST){ // 送信ボタンが押された($_FILESと$_POSTが送られた)場合**
**    $content = NULL;
    $mtype = NULL;
    $usercomment=NULL;//TASK8
    $img_mtype = array('image/png', 'image/jpg', 'image/jpeg', 'image/gif');


    if ($_FILES['user_file']['error'] == UPLOAD_ERR_INI_SIZE || 
        $_FILES['user_file']['error'] == UPLOAD_ERR_FORM_SIZE){ //容量の制限(php&htmlフォーム)をチェック
      print 'ファイルサイズが制限(1MB)を超えています。<br>';
    }
    elseif ($_FILES['user_file']['error'] == UPLOAD_ERR_OK &&
       is_uploaded_file($_FILES['user_file']['tmp_name'])) { //アップロードエラー無し、かつ、テンポラリファイルがPOSTでアップされたもの(セキュリティ用)の場合
      $finfo = finfo_open(FILEINFO_MIME_TYPE); // ファイル情報の準備(MIMEタイプ)
      $mtype = finfo_file($finfo, $_FILES['user_file']['tmp_name']); //MIMEタイプの取得



      if(!in_array($mtype, $img_mtype)){ //MIMEタイプが画像用か確認
        print "アップされたファイルのMIMEタイプは{$mtype}です。<br>画像として認識できません。<br>";

      }
      else {
        $content = file_get_contents($_FILES['user_file']['tmp_name']); //ファイルの内容を文字列として読み込む(BLOBでDBに格納する用)     

        try {
          $pdo->beginTransaction(); // トランザクションを開始する(複数の処理をまとめ、一貫性を保つ)
          $sql = "INSERT INTO $table (id, mime, image,comment,gender) VALUES ( :id, :mime, :image, :comment, :gender)";//プリペアドステートメントを使った、SQL文(レコード登録)のテンプレート
          $stmh = $pdo->prepare($sql);//SQL実行の準備をし、ステートメントハンドラを返す
          $stmh->bindValue(':id', $userID, PDO::PARAM_STR );//プレースホルダと外部からの値を結びつける
          $stmh->bindValue(':image', $content, PDO::PARAM_LOB );
          $stmh->bindValue(':mime', $mtype, PDO::PARAM_STR ); // TASK7
          $stmh->bindValue(':comment',$usercomment, PDO::PARAM_STR ); //TASK8 
          $stmh->bindValue(':gender',$usergender, PDO::PARAM_STR ); //TASK8 

          $stmh->execute(); // プリペアドステートメント(SQL文のテンプレート)を実行する
          $pdo->commit(); // SQL文による変更を確定し、トランザクションを終了する
          print 'データを' . $stmh->rowCount() . '件、挿入しました。<br>'; //SQL文実行で影響を受けた行数を取得する
        }
        catch (PDOException $Exception) { //処理がうまくいかない場合の例外処理
          $pdo->rollBack(); // トランザクション開始前の状態に戻す
          print 'エラー:' . $Exception->getMessage();
        }
      }
    }
    else {
      print '画像ファイルなし or アップロード失敗...<br>';
    }
  }

  // ■■■■■■■■■■■■ データ出力に関する処理  ■■■■■■■■■■■■ //

  // 検索および現在の全データを表示します
  try {
    $sql= "SELECT * FROM $table "; // テーブル内のレコードを全件取得するSQL文
    $stmh = $pdo->prepare($sql); //SQL実行の準備をし、ステートメントハンドラを返す
    $stmh->execute();// プリペアドステートメント(SQL文のテンプレート)を実行する
    $count = $stmh->rowCount(); //SQL文実行で影響を受けた行数を取得する
    print "登録件数は" . $count . "件です。<BR>";
  } catch (PDOException $Exception) {//処理がうまくいかない場合の例外処理
    print "エラーっぽい。:" . $Exception->getMessage();
  }

  while ($row = $stmh->fetch(PDO::FETCH_ASSOC)) {// カラム名を添え字にした連想配列で結果を取得
    print '<div class="tweet">';
    print '<img src="image.php?id=' . htmlspecialchars($row['id']) . '">'; // imgタグで保存ファイルを表示
    print '<div class="description">';
    print '<'. htmlspecialchars($row['id']) . '>';
    print $_SESSION['name'] = $userName;
    print $_SESSION['id'] = $userID;
     print $_SESSION['gender'] =$usergender;
   print '<br>';
    print '投稿日時:';
    echo date( "Y年m月d日 H時i分s秒" );
    print '<br>';
    print 'MIMEタイプ:';
     print ''. htmlspecialchars($row['mime']) . '';
    print '<br>';
    print 'コメント:';
     print ''. htmlspecialchars($row['comment']) . '';
    print'<hr>';
    print '</div>';
    print '</div>';
  }

    print '$_POSTの内容確認';
      echo'<pre>';
       print_r($_POST);
      echo'</pre>';

     print '$_FILESの内容確認';
      echo'<pre>';
     __** print_r($_FILES);
**__      echo'</pre>';

      print '$_SESSIONの内容確認';
      echo'<pre>';
       print_r($_SESSION);
      echo'</pre>';


?>
</body>
</html>

補足情報(言語/FW/ツール等のバージョンなど)

申し訳ありません、エラーが出た部分の列番号を記述し忘れていました。
107:if($_FILES && $_POST){ // 送信ボタンが押された($_FILESと$_POSTが送られた)場合
199:print_r($_FILES);
PHPのバージョンは7.1.1です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m.ts10806

    2017/08/03 11:46

    PHPのバージョン等補足情報は質問本文に追記願います。

    キャンセル

  • mashu15_2

    2017/08/03 11:55

    Parse error: syntax error, unexpected 'if' (T_IF) in F:\xampp\htdocs\xampp\exFinal\exFinal_home.php on line 108というエラーが出てしまいました。

    キャンセル

  • m.ts10806

    2017/08/03 17:23

    ん、それは単に書き方を間違えただけでは。。 var_dump($_FILES); を実行するという意味だったのですが。。

    キャンセル

回答 3

+3

if($_FILES && $_POST){


おそらくこの部分のエラーですね。
アップロードされないときは$_FILESは定義されていないはずです。
javascriptではこういう構文で存在していなくても問題なく処理できるのですが、phpでは変数が定義されていないとエラーになります。
変数が定義されているかどうかの確認なので、

if (isset($_FILES) && isset($_POST)){


としてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/02 15:31

    ちょっと横からすみません。確認です。
    $_FILES["user_file"]を参照しようとして未定義ならまだ分かるんですが・・・
    POST送信でなくても$_FILESはarray(0) { } で定義はされているのですが、
    PHPのバージョンによるんでしょうか?

    キャンセル

  • 2017/08/02 15:40

    回答ありがとうございます。ご指摘のとおりに変更したところ、一つ目のエラーは消えたのですが、二つ目のエラーは残ってしまいました。解決方法はあるのでしょうか?

    キャンセル

+1

下記のように変更してみてはどうでしょうか?

if($_FILES && $_POST){
↓
if ($_SERVER['REQUEST_METHOD'] === 'POST') {

また念のため、$_FILES['user_file']利用前にarray_key_exists()で$_FILES['user_file']の存在確認をしておいた方が良いと思います。

追記:
これだけだと後ろの$_FILESでのエラーは解消できないと思うので、
ifの閉じる場所を最後の方に(?>の前くらい)移動してください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/02 16:25

    回答ありがとうございます。
    ご指摘の通りにやってみたところ、エラーは出ないのですが文章と画像が表示されなくなってしまいました。

    キャンセル

  • 2017/08/02 16:27 編集

    すみません。追記部分は私の指摘ミスです。スルーしてください。
    アップロード後にSELECTしてましたね。失礼しました。
    isset($_FILES)対応で回避はできますが、根本的な解決になってない気がします。
    $_FILESはPOST送信してなくても定義だけはされてるはずなので。

    キャンセル

  • 2017/08/03 15:22

    それ、print_r($_FILES);しようとしている箇所だったりしませんかね?

    キャンセル

-2

× $_FILES['user_file']
○ $_FILES['userfile']

上記のことは忘れてください(;_;)

mts10806さんのコメントにあるように、アップロードされていなくてもarray(0) { }で定義されているものと思ったのですが、isset対応で回避できたのであれば、理由はわかりませんが定義されていないのでしょう。
なので、最初のエラーはzohnamさんの回答通り、

if (isset($_FILES) && isset($_POST)){


で良いかと思います。
2つめのエラーも同様な対応にするしかないと思われるので、

if (isset($_FILES)){
    print_r($_FILES);
}


としておくのがとりあえずの対処法かと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/02 15:28

    user_fileで合ってますよー

    キャンセル

  • 2017/08/02 15:59 編集

    おー、失礼。
    マニュアルそのまま見てました。

    キャンセル

  • 2017/08/02 16:05

    いえ、提示ソースでは"user_file"と命名されてるので。

    キャンセル

  • 2017/08/02 16:05

    あ、気づかれたようで、よかったです。

    キャンセル

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

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