

PHPでECサイトを作成しています。  
画像ファイルをアップロードするときに何も選択していない場合はエラーメッセージを表示する処理を作成しました。  
[![画像の説明をここに入力](https://i.stack.imgur.com/MU1f7.png)](https://i.stack.imgur.com/MU1f7.png)

[![画像の説明をここに入力](https://i.stack.imgur.com/o2DWZ.png)](https://i.stack.imgur.com/o2DWZ.png)

しかし、同時に画像ファイルを選択したときでもエラーメッセージが表示され、画像を保存できなくなりました。  
[![画像の説明をここに入力](https://i.stack.imgur.com/A2CPg.png)](https://i.stack.imgur.com/A2CPg.png)  
[![画像の説明をここに入力](https://i.stack.imgur.com/5YnCU.png)](https://i.stack.imgur.com/5YnCU.png)  
ちなみにデータベースのデータはこのような感じです。  
[![画像の説明をここに入力](https://i.stack.imgur.com/QUBOS.png)](https://i.stack.imgur.com/QUBOS.png)

もしかしたらif文の指定の方法を間違えているのかなと思っております。  
お手数おかけしますがご教授のほどよろしくお願いいたします。

ソースコード  
functions.php

[code]

    <?php
    require_once('../../include/conf/const.php');
    
    function get_db_connect() {
     
    if (!$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD, DB_NAME)) {
            die('error: ' . mysqli_connect_error());
        }
        mysqli_set_charset($link, DB_CHARACTER_SET);
        return $link;
    }
    
    function close_db_connect($link) {
    
        mysqli_close($link);
    }
    
    function insert_item($link) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        return;
    }
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'insert') {
            
            if (isset($_POST['name']) === TRUE) {
                
                $new_name = $_POST['name'];
            }
            
            if (isset($_POST['price']) === TRUE) {
            
                $new_price = $_POST['price'];
                
            }
            
            if (isset($_POST['stock']) === TRUE) {
                
                $new_stock = $_POST['stock'];
            }
            
            $img_path = '../file/';
            $filename = $_FILES['new_img']['name'];
           
            move_uploaded_file($_FILES['new_img']['tmp_name'], $img_path.$filename);
            $new_img = $img_path.$filename;
            
            
            if (isset($_POST['status']) === TRUE) {
            if ((int) $_POST['status'] === 0 || (int) $_POST['status'] === 1) {
                 
                 $new_status = (int) $_POST['status'];
            }
                
            }
            
                $new_time = date('Y-m-d H:i:s');
                
                $sql = 'INSERT INTO item_tb(name, price, stock, img, status, created_date, updated_date) VALUES(\''.$new_name.'\',\''.$new_price.'\',\''.$new_stock.'\',\''.$new_img.'\',\''.$new_status.'\',\''.$new_time.'\',\''.$new_time.'\')';
    
                if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                    
                    
                }
                
              
              }
        }
        
    
    
            
    function update_item($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'update') {
            if (isset($_POST['item_id']) === TRUE) {
                (int)$item_id = (int)$_POST['item_id'];
                print"A";
            }
            
            if (isset($_POST['stock']) === TRUE) {
                    (int)$update_stock = (int)($_POST['stock']);
                    var_dump($update_stock);
                    $sql = 'UPDATE item_tb SET stock = ' . $update_stock. ' Where id =' . $item_id;
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                    } else {
                       $err_msg[] = 'DBエラーが発生しました。';
                       return $err_msg;
                    }
                    }
            }
    }
    
    
    
    
    
    function change_item($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'change') {
             if (isset($_POST['item_id']) === TRUE) {
                
                (int)$item_id = (int)$_POST['item_id'];
            }
            if (isset($_POST['change_status']) === TRUE) {
                if ((int) $_POST['change_status'] === 0 || (int) $_POST['change_status'] === 1) {
                    $change_status = (int) $_POST['change_status'];
                    $sql = 'UPDATE item_tb SET status = ' . $change_status. ' Where id =' . $item_id;
    
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                        
                    } else {
                        $err_msg[] = 'ステータスの変更に失敗しました';
                    }
                } else {
                    $err_msg[] = 'ステータスは公開か非公開を選択してください';
                    return $err_msg;
                }
            }
        }
        
    }
    
    function delete_item($link) {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'delete') {
            
             if (isset($_POST['item_id']) === TRUE) {
                 
                (int)$item_id = (int)$_POST['item_id'];
                
            }
            if (isset($_POST['delete']) === TRUE) {
                    $sql = 'DELETE FROM item_tb Where id =' . $item_id;
    
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                        
                    } else {
                        $err_msg[] = '削除に失敗しました';
                    return $err_msg;
                }
            }
        }
        
    }
    
    
    function do_sql($link) {
        $sql = 'SELECT item_tb.id, item_tb.name, item_tb.price, item_tb.stock, item_tb.img, item_tb.status
        FROM item_tb';
        $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
        return $data;
    }
    
    function complete_check_insert($link) {
        $complete_msg[] = '追加登録完了!';
        return $complete_msg;
    }
    
    function complete_check_update($link) {
        $complete_msg[] = '在庫数更新完了!';
        return $complete_msg;
    }
    
    function complete_check_change($link) {
        $complete_msg[] = 'ステータス変更完了!';
        return $complete_msg;
    }
    
    function complete_check_delete($link) {
        $complete_msg[] = '削除完了!';
        return $complete_msg;
    }
    
    function complete_check_entry($link) {
        $complete_msg[] = '新規登録完了!';
        return $complete_msg;
    }
    
    function validation_check($link) {
       $err_msg = [];
       if (!isset($_POST['name']) || (isset($_POST['name']) && $_POST['name'] === ""))  {
         $err_msg[] = '商品名を入力してください。';
        }
        
        if (!isset($_POST['price']) || (isset($_POST['price']) && $_POST['price'] === "")) {
         $err_msg[] = '値段を入力してください';
        } else if(preg_match('/^[0-9]+$/',($_POST['price'])) !== 1) {
         $err_msg[] = '値段は0以上の半角整数を入力してください';
        }
        
        if (!isset($_POST['stock']) || (isset($_POST['stock']) && $_POST['stock'] === "")) {
         $err_msg[] = '在庫を入力してください';
        } else if(preg_match('/^[0-9]+$/',($_POST['stock'])) !== 1) {
         $err_msg[] = '在庫は0以上の半角整数を入力してください';
        }
        
        if (!empty($_POST['status'])) {
        if ((int) $_POST['status'] === 2) {
         $err_msg[] = 'ステータスは公開か非公開を選択してください'; 
        }
        }
        
        if (!isset($_POST['new_img'])) {
            $err_msg[] = '画像を選択してください';
        }
        
        
        
    return $err_msg;
    }
        
    
    
    function get_post_data($key) {
       $str = '';
       if (isset($_POST[$key]) === TRUE) {
           $str = $_POST[$key];
       }
       return $str;
    }
    function insert_entry($link) {
    
    $user  = get_post_data('user');
    $password = get_post_data('password');
    $new_time = date('Y-m-d H:i:s');
           
    $sql = 'INSERT INTO user_tb(user, password, created_date, updated_date) VALUES(\''.$user.'\',\''.$password.'\',\''.$new_time.'\',\''.$new_time.'\')';
    
    $data = [];
    
    if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
                } else {
                    $err_msg[] = 'DBエラーが発生しました。';
                    return $err_msg;
                }
    }
    
    function select_entry($link) {
    $sql = 'SELECT user_tb.user, user_tb.password, user_tb.created_date, user_tb.updated_date FROM user_tb ';
    $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
        return $data;
    }
    
    function validation_check2($link) {
        $err_msg = [];
        $user = $_POST['user'];
        $password = $_POST['password'];
        
        if (!isset($user) || (isset($user) && $user === "")) {
         $err_msg[] = 'ユーザ名を入力してください';
        } else if (preg_match('/[^A-Za-z0-9]/', $user)) {
         $err_msg[] = 'ユーザ名は半角英数字で入力してください';
        } else if (mb_strlen($user) <= 5) {
         $err_msg[] = 'ユーザ名は6文字以上で入力してください';
        } else if ($user === $user) {
         $err_msg[] = '同じユーザ名は登録できません。';
        }
        
        if (!isset($password) || (isset($password) && $password === "")) {
         $err_msg[] = 'パスワードを入力してください';
        } else if (preg_match('/[^A-Za-z0-9]/', $password)) {
         $err_msg[] = 'パスワードは半角英数字で入力してください';
        } else if (mb_strlen($password) <= 5) {
         $err_msg[] = 'パスワードは6文字以上で入力してください';
        }
        
    return $err_msg;
    }
    
[/code]

tool.php

[code]

    <?php
    $data = [];
    require_once('../../include/conf/const.php');
    require_once('../../include/model/functions.php');
    $link = get_db_connect();
    if (isset($_POST['add'])) {
        $err_msg = validation_check($link);
         if ($err_msg == [])   {
            $data = insert_item($link);
            $complete_msg = complete_check_insert($link);
        }
        }
        
        if (isset($_POST['update'])) {
            $data = update_item($link);
            $complete_msg = complete_check_update($link);
        }
        
        if (isset($_POST['change'])) {
            $data = change_item($link);
            $complete_msg = complete_check_change($link);
        }
        
        if (isset($_POST['delete'])) {
            $data = delete_item($link);
            $complete_msg = complete_check_delete($link);
        }
        
        
        
        if (count($err_msg) !== 0)  {
            foreach ($err_msg as $err) { ?>
                <p><?php print $err; ?></p> 
        <?php }
        }
        
        if (count($complete_msg) !== 0)  {
            foreach ((array)$complete_msg as $comp) { ?>
                <p><?php print $comp; ?></p> 
        <?php }
        }
    $data = do_sql($link);
    require_once('../../include/view/tool2.php');
    
    close_db_connect($link);
    
[/code]

tool2.php

[code]

    <!DOCTYPE html>
    <?php require_once('../../htdocs/mvc/tool.php');?>
    <html lang="ja">
    
    <head>
        <meta charset="UTF-8">
        <title>ECサイト</title>
    </head>
    
    <body>
    
        <h1>ECサイト</h1>
        <a href='../../mvc/usertool.php'>ユーザ管理ページ</a>
    
        <section>
            <h2>新規商品追加</h2>
    
            <form action="tool.php" method="post" enctype="multipart/form-data">
                <label>名前: <input type="text" name="name" size="30" /></label><br>
                <label>値段: <input type="text" name="price" size="30" /></label><br>
                <label>個数: <input type="text" name="stock" size="30" /></label><br>
                <p></p>
                <input type="file" name="new_img" accept="image/jpeg, image/png, image/gif" /><br>
                <select name="status"><br>
                    <option value="0">非公開</option>
                    <option value="1">公開</option>
                    <option value="2">入力チェック用</option>
                </select><br>
                <input type="hidden" name="sql_kind" value="insert">
                <input type="submit" name="add" value="■□■□商品追加■□■□" />
            </form>
    
        </section>
    
        <section>
            <h2>商品情報変更</h2>
            <table>
                <caption>商品一覧</caption>
                <tbody>
                    <tr>
                        <th>商品名</th>
                        <th>価格</th>
                        <th>画像</th>
                        <th>在庫数</th>
                        <th>ステータス</th>
                    </tr>
                    <?php 
                    if (empty($data) !== TRUE) {
                        foreach ((array)$data as $list) {
                            if ((int) $list['status'] === 0) { ?>
                                <tr class="status_0">
                                <?php } else { ?>
                                <tr>
                                <?php } ?>
                                <? php print htmlspecialchars($list,ENT_QUOTES,'UTF-8'); ?>
                                <td class="d_name"><?php print $list['name']; ?></td>
                                <td class="d_price"><?php print $list['price']; ?></td>
                                <td> <img src="<?php print $list['img']; ?>"></td>
                                <td>
                                    <form method="post">
                                        <input type="text" class="input_text_width text_align_right" name="update_stock" value="<?php echo $list['stock']; ?>">個
                                        <br>
                                        <input type="submit" name="update" value="変更">
                                        <input type="hidden" name="sql_kind" value="update">
                                </td>
                                
                                
                                <?php if ((int) $list['status'] === 0) { ?>
                                    <td class="d_status">
                                        <form method="post">
                                            <input type="submit" name="change" value="非公開 → 公開">
                                            <input type="hidden" name="change_status" value="1">
                                            <input type="hidden" name="sql_kind" value="change">
                                            <input name="item_id" type="hidden" value="<?php echo $list['id']; ?>">
                                             </form>
                                              </td>
                                        <td class="d_delete">
                                        <form method="post">
                                        <input name="item_id" type="hidden" value="<?php echo $list['id']; ?> ">
                                        <input type="submit" name="delete" value="削除">
                                        <input type="hidden" name="sql_kind" value="delete">
                                        </form>
                                    </td>
                                </tr>
                                
                            <?php } else { ?>
                                <td class="d_status">
                                    <form method="post">
                                        <input type="submit"  name="change" value="公開 → 非公開">
                                        <input type="hidden" name="change_status" value="0">
                                        <input type="hidden" name="sql_kind" value="change">
                                        <input name="item_id" type="hidden" value="<?php echo $list['id']; ?> ">
                                        </form>
                                         </td>
                                        <td class="d_delete">
                                        <form method="post">
                                        <input name="item_id" type="hidden" value="<?php echo $list['id']; ?> ">
                                        <input type="submit" name="delete" value="削除">
                                        <input type="hidden" name="sql_kind" value="delete">
                                        </form>
                                </td>
                                </tr>
                    <?php }
                            }
                        } ?>
                                    
                </tbody>
            </table>
        </section>
    </body>
    
    </html>
    
[/code]

const.php

[code]

    <?php
    $err_msg = [];
    $complete_msg = [];
    $data = [];
    $user = "";
    $password = 0;
    $login_err_flag = TRUE;
    
    define('DB_HOST',   ''); // データベースのホスト名又はIPアドレス
    define('DB_USER',   '');  // MySQLのユーザ名
    define('DB_PASSWD', '');    // MySQLのパスワード
    define('DB_NAME',   '');    // データベース名
    
    define('HTML_CHARACTER_SET', 'UTF-8');  // HTML文字エンコーディング
    define('DB_CHARACTER_SET',   'UTF8');   // DB文字エンコーディング
    
    date_default_timezone_set('Asia/Tokyo');
    
[/code]


CC BY-SA 4.0
2021-12-04T06:07:10.923
83951
2021-12-06T05:55:32.917
48303
question
php
画像ファイルの中身の確認がうまくいかない。


まずはデバックや調査方法を学びましょう。デバッグのやり方をもとに今回の現象を説明していきます。  
プログラムが止まるたびに質問をしていてはなかなか前に進みません。

デバッグの基本は「想定の変数が設定されているか確認すること」と「分岐処理が正しく行われているか確認すること」です。

画像がアップロードされても、画像がアップロードされなくても同じエラーが出力されているということは以下の文が怪しく感じます。

[code]

    if (!isset($_POST['new_img'])) {
        $err_msg[] = '画像を選択してください';
    }
    
[/code]

そこでここでデバッグしてみます。$_POST['new_img']が存在していればfalse、存在していなければtrueです。では本当に存在していないのでしょうか？本当に分岐がtrueになり続けているのでしょうか？

[code]

    var_dump($_POST['new_img']); //それだけ出力してみる
    var_dump($_POST);//一応全体をやってもよし
    var_dump(!isset($_POST['new_img']));//分岐のチェックをしたいのであれば条件そのまま出力してもよいでしょう
    exit; //以降の処理はいったんいらないので止めちゃってもよし。
    if (!isset($_POST['new_img'])) {
        $err_msg[] = '画像を選択してください';
    }
    
[/code]

すると画像をアップロードしてみても、アップロードしなくても$_POSTの中には'new_img'が存在しないことが確認できます。なぜでしょうか？

あとはお友達のGoogleさんに聞いてみます。「php $_POST 仕様 ファイル」  
最初の公式の記事が出てきました。[POST
メソッドによるアップロード](https://www.php.net/manual/ja/features.file-upload.post-
method.php)

> グローバルの $_FILES には、アップロードされたファイルの情報が含まれます。

そのほかの記事やほかのQAサイトの内容を確認すると  
$_POSTではなくて$_FILES を使うとあります。つまりはファイルアップロード時には  
$_POSTではなく$_FILESを使わなければいけないようです。

さらに「php $_FILES エラー」とかで調べてもよいでしょう。  
ファイルのエラーチェックはアップロードしたか以外にもサイズによるエラーやディスク書き込みにわたるエラーまで様々なエラーが発生します。  
[エラーメッセージの説明](https://www.php.net/manual/ja/features.file-upload.errors.php)  
今回は正しくアップロードされたかどうかだけですので、シンプルに

[code]

    if (!isset($_FILES['new_img'])) {
        $err_msg[] = '画像を選択してください';
    }else if ($_FILES['upload']['size'] === 0) {　//ファイルのサイズが0つまりは送信されていない
        $err_msg[] = '画像を選択してください';
    }else if ($_FILES['upload']['error'] !== 0) { //とりあえずエラー（0以外)だったらだったらエラーとしておく）
        $err_msg[] = '画像を選択してください';
    }
    
[/code]

ファイルアップロードのエラーチェックはかなり多岐にわたり今回のように単純にアップロードされるされない以外にもアップロードできるファイルサイズの調整やアップロードできるファイルの種類、などを考慮する必要があり要件を依頼主と検討しなければなりません。  
この辺りはプログラマがどのような条件でどういったことが発生するのかきちんと把握してどのように処理するのか説明できるようにしておきましょう。


CC BY-SA 4.0
2021-12-06T00:59:27.670
83963
2021-12-06T05:55:32.917
2021-12-06T05:55:32.917
22665
22665
83951
answer