PHPで自動販売機システムを製作しています。  
必須項目を入力していない時にエラーメッセージを表示する仕様にしたいのですが、  
[![画像の説明をここに入力](https://i.stack.imgur.com/GOYpe.png)](https://i.stack.imgur.com/GOYpe.png)

何も入力選択しないで商品追加ボタンを押してもエラーメッセージが表示されません。  
[![画像の説明をここに入力](https://i.stack.imgur.com/WHXbK.png)](https://i.stack.imgur.com/WHXbK.png)

また、一部を空欄にして商品追加ボタンを押しても  
[![画像の説明をここに入力](https://i.stack.imgur.com/9zpbF.png)](https://i.stack.imgur.com/9zpbF.png)  
エラーメッセージが表示されないです。  
[![画像の説明をここに入力](https://i.stack.imgur.com/Fph7f.png)](https://i.stack.imgur.com/Fph7f.png)

* * *

### ソースコード

functions.php

```

    <?php
    /*include/confの中にあるconst.phpファイルを読み込んでいる。*/
    require_once('../../include/conf/const.php');
    /*htdocs/mvcの中にあるtool.phpファイルを読み込んでいる。*/
    require_once('../../htdocs/mvc/tool.php');
    /*htdocs/mvcの中にあるindex.phpファイルを読み込んでいる。*/
    require_once('../../htdocs/mvc/index.php');
    /*htdocs/mvcの中にあるresult.phpファイルを読み込んでいる。*/
    require_once('../../htdocs/mvc/result.php');
    
    /*$uploaddirに'./drink_picture/'を代入。*/
    
    
    /*$err_msgに空の配列を代入。*/
    $err_msg = [];
    
    /*$complete_msgに空の配列を代入。*/
    $complete_msg = [];
    
    /*DBに接続するための関数。*/
    function get_db_connect() {
     
    /*もし、DB_HOST, DB_USER, DB_PASSWD, DB_NAMEを元にmysqli_connectに接続できなかったら、*/
    if (!$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWD, DB_NAME)) {
            /*mysqli_connect_errorを出し、処理を終了する。*/
            die('error: ' . mysqli_connect_error());
        }
        /*それ以外なら、$link, DB_CHARACTER_SETの値をセットする。*/
        mysqli_set_charset($link, DB_CHARACTER_SET);
        /*$linkを返す。*/
        return $link;
    }
    
    /*データベース切断に使う関数。*/
    function close_db_connect($link) {
    
        /*$linkを引き数に切断する。*/
        mysqli_close($link);
    }
    
    /*$linkを引数に商品を追加する関数。*/
    function insert_drink($link) {
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        return;
    }
    /*もしも$_SERVER['REQUEST_METHOD']の中身が'POST'かつ$_POST['sql_kind']の中身が'insert'ならば*/
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'insert') {
            
            /*もしもisset($_POST['new_name']の中身がTRUEならば*/
            if (isset($_POST['new_name']) === TRUE) {
                
                /*TRUEの時*/          
                switch (TRUE) {
                    
                    /*$_POST['new_name']の中身が空ならば*/
                    case ($_POST['new_name'] === ''):
                        
                        /*配列$err_msgの中に'商品名を入力してください'を入れる。*/
                        $err_msg[] = '商品名を入力してください';
                        
                        
                        /*breakで処理中断。*/
                        break;
                        
                    /*$_POST['new_name']の中身がNULLならば*/
                    case ($_POST['new_name'] === NULL);
                    
                        /*配列$err_msgの中に'商品名を入力してください'を入れる。*/
                        $err_msg[] = '商品名を入力してください';
                        
                        
                        /*breakで処理中断。*/
                        break;
                        
                    /*デフォルトならば*/
                    default:
                        
                        /*$new_nameに$_POST['new_name']を入れる。*/
                        $new_name = $_POST['new_name'];
                        
                        /*breakで処理中断。*/
                        break;
                }
            }
            /*もしもisset($_POST['price']の中身がTRUEならば*/
            if (isset($_POST['new_price']) === TRUE) {
                
                /*TRUEの時*/  
                switch (TRUE) {
                    
                    /*$_POST['new_price']の中身が空ならば*/ 
                    case ($_POST['new_price'] === ''):
                        
                        /*配列$err_msgの中に'商品名を入力してください'を入れる。*/
                        $err_msg[] = '値段を入力してください';
                        
                         /*breakで処理中断。*/
                        break;
                        
                     /*$_POST['new_price']の中身がNULLならば*/
                    case ($_POST['new_price'] === NULL):
                        
                        /*配列$err_msgの中に'値段を入力してください'を入れる。*/
                        $err_msg[] = '値段を入力してください';
                        
                         /*breakで処理中断。*/
                        break;
                        
                    /*preg_match('/^[0-9]+$/', $_POST['new_price']) !== 1ならば*/
                    case (preg_match('/^[0-9]+$/', $_POST['new_price']) !== 1):
                        
                        /*配列$err_msgの中に'値段は0以上の半角整数を入力してください'を入れる。*/
                        $err_msg[] = '値段は0以上の半角整数を入力してください';
                        return  $err_msg;
                        
                         /*breakで処理中断。*/
                        break;
                        
                     /*デフォルトならば*/
                    default:
                        
                        /*$new_priceに$_POST['new_price']を入れる。*/
                        $new_price = $_POST['new_price'];
                         /*breakで処理中断。*/
                        break;
                }
            }
            
             /*もしもisset($_POST['new_stock']の中身がTRUEならば*/
            if (isset($_POST['new_stock']) === TRUE) {
                
                /*TRUEの時*/
                switch (TRUE) {
                    
                    /*$_POST['new_stock']の中身が空ならば*/ 
                    case ($_POST['new_stock'] === ''):
                        
                        
                        /*配列$err_msgの中に'個数を入力してください'を入れる。*/
                        $err_msg[] = '個数を入力してください';
                        
                         /*breakで処理中断。*/
                        break;
                        
                    /*$_POST['new_stock']の中身がNULLならば*/
                    case ($_POST['new_stock'] === NULL):
                         /*配列$err_msgの中に'個数を入力してください'を入れる。*/
                        $err_msg[] = '個数を入力してください';
                        
                         /*breakで処理中断。*/
                        break;
                        
                     /*preg_match('/^[0-9]+$/', $_POST['new_stock']) !== 1ならば*/
                    case (preg_match('/^[0-9]+$/', $_POST['new_stock']) !== 1):
                        
                        /*配列$err_msgの中に'在庫は0以上の半角整数を入力してください'を入れる。*/
                        $err_msg[] = '在庫は0以上の半角整数を入力してください';
                        
                         /*breakで処理中断。*/
                        break;
                        
                    /*デフォルトならば*/
                    default:
                        
                        /*$new_stockに$_POST['new_stock']を入れる。*/
                        $new_stock = $_POST['new_stock'];
                        
                        /*breakで処理中断。*/
                        break;
                }
            }
            /*もしも$_FILES['new_img']['error']の中身にUPLOAD_ERR_OKが入ってるならば*/
            if ($_FILES['new_img']['error'] === UPLOAD_ERR_OK) {
                
                    /* $chk_pictureにgetimagesize($_FILES['new_img']['tmp_name'])を代入する。*/
                    $chk_picture = getimagesize($_FILES['new_img']['tmp_name']);
                    
                    /*もしも$chk_picture['mine]に'image/png'が入っているまたは、$chk_picture['mine]に'image/jpeg'が入っているならば、*/
                    if ($chk_picture['mime'] === 'image/png' || $chk_picture['mime'] === 'image/jpeg') {
                        
                        /*もしも$chk_picture[0]が500以下かつ、$chk_picture[1]が500以下ならば、*/
                        if ($chk_picture[0] <= 500 && ($chk_picture[1] <= 500)) {
                            
                            /*$mineに$chk_picture['mime']を代入。*/
                            $mime = $chk_picture['mime'];
                            
                            /*$mineの時*/
                            switch ($mime) {
                                /*'image/png'ならば*/
                                case 'image/png':
                                    
                                    /*$typeに'.png'を代入。*/
                                    $type = '.png';
                                    
                                    /*breakで処理中断。*/
                                    break;
                                
                                /*'image/ipeg'ならば*/
                                case 'image/jpeg':
                                    
                                    /*$typeに'.jng'を代入。*/
                                    $type = '.jpg';
                                    
                                     /*breakで処理中断。*/
                                    break;
                            }
                            $uploaddir = './drink_picture/';
                           $upload = $uploaddir . date('YmdHis') . rand(0, 10000) . $type;
                            move_uploaded_file($_FILES['new_img']['tmp_name'], $upload);
                          /*違うならば*/
                        } else {
                            /*配列$err_msgの中に'ファイルは縦と横500px以内にしてください'を入れる。*/
                            $err_msg[] = 'ファイルは縦と横500px以内にしてください';
                        }
                    /*違うならば*/
                    } else {
                        /*配列$err_msgの中に'PNGかJPEG形式のファイルをアップロードしてください'を入れる。*/
                        $err_msg[] = 'PNGかJPEG形式のファイルをアップロードしてください';
                    }
                }
              /*違うならば*/
            } else {
                /*配列$err_msgの中に'ファイルを選択してください'を入れる。*/
                $err_msg[] = 'ファイルを選択してください';
            }
    
            /*もしもisset($_POST['new_status']の中身がTRUEならば*/
            if (isset($_POST['new_status']) === TRUE) {
                
                /*もしもisset($_POST['new_stock']の中身がTRUEならば*/
                if ((int) $_POST['new_status'] === 0 || (int) $_POST['new_status'] === 1) {
                    $new_status = (int) $_POST['new_status'];
                } else {
                    $err_msg[] = 'ステータスは公開か非公開を選択してください';
                
                }
            } else {
                $err_msg[] = 'ステータスを選択してください';
                
            }
    
    
                $new_time = date('Y-m-d H:i:s');
    
                $insert_data_info = [
                    'drink_name' => $new_name,
                    'price' => $new_price,
                    'created_at' => $new_time,
                    'updated_at' => $new_time,
                    'status' => $new_status,
                    'path' => $upload
                ];
    
                $sql = 'INSERT INTO drink_info_table(drink_name, price, created_at, updated_at, status, path) VALUES(\''.$new_name.'\',\''.$new_price.'\',\''.$new_time.'\',\''.$new_time.'\',\''.$new_status.'\',\''.$upload.'\')';
    
                if ($result = mysqli_query($link, $sql) === TRUE) {
    
                    $drink_id = mysqli_insert_id($link);
    
                    $insert_data_stock = [
                        'drink_id' => $drink_id,
                        'stock' => $new_stock,
                        'created_at' => $new_time,
                        'updated_at' => $new_time
                    ];
    
                    $sql = 'INSERT INTO stock_table(drink_id, stock, created_at, updated_at) VALUES(\''.$drink_id.'\',\''.$new_stock.'\',\''.$new_time.'\',\''.$new_time.'\')';
    
                    if ($result = mysqli_query($link, $sql) !== TRUE) {
                        $err_msg[] = 'stock_tableへのデータの登録に失敗しました';
                        
                    }
                } else {
                    $err_msg[] = 'drink_info_tableへのデータの登録に失敗しました';
                    
                }
                    $complete_msg[] = '追加登録完了!';
                }
    
    
            
    function update_drink() {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'update') {
    
            if (isset($_POST['update_stock']) === TRUE) {
                if (preg_match('/^[0-9]+$/', cut($_POST['update_stock'])) === 1) {
                    $update_stock = (int) cut($_POST['update_stock']);
    
                    $update_time = date('Y-m-d H:i:s');
    
                    $update_id = $_POST['drink_id'];
    
                    $sql = 'UPDATE stock_table SET stock = ' . $update_stock . ', updated_at = \'' . $update_time . '\' WHERE drink_id = ' . $update_id;
    
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                        $complete_msg[] = '在庫数更新完了!';
                        
                        
                    } else {
                        $err_msg[] = '在庫数の更新に失敗しました';
                        
                    }
                } else {
                    $err_msg[] = '0以上の半角整数を入力してください';
                    
                }
            }
        }
    }
    function change_drink() {
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['sql_kind'] === 'change') {
    
            if (isset($_POST['change_status']) === TRUE) {
                if ((int) $_POST['change_status'] === 0 || (int) $_POST['change_status'] === 1) {
                    $change_id = $_POST['drink_id'];
                    $change_status = (int) $_POST['change_status'];
    
                    $change_time = date('Y-m-d H:i:s');
    
                    $sql = 'UPDATE drink_info_table SET updated_at = \'' . $change_time . '\', status = ' . $change_status . ' WHERE drink_id = ' . $change_id;
    
    
                    if ($result = mysqli_query($link, $sql) === TRUE) {
                        $complete_msg[] = 'ステータス変更完了!';
                        
                    } else {
                        $err_msg[] = 'ステータスの変更に失敗しました';
                    }
                } else {
                    $err_msg[] = 'ステータスは公開か非公開を選択してください';
                }
            }
        }
    
        if (count($err_msg) === 0) {
            
            mysqli_commit($link);
        } else {
            
            mysqli_rollback($link);
        }
    
        $sql = 'SELECT drink_info_table.drink_id, drink_info_table.drink_name, drink_info_table.price, stock_table.stock, drink_info_table.status, drink_info_table.path FROM drink_info_table LEFT JOIN stock_table ON drink_info_table.drink_id = stock_table.drink_id';
        
        if ($result = mysqli_query($link, $sql)) {
    
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
    }
    
    
    
    function do_sql($link) {
        $sql = 'SELECT drink_info_table.drink_id, drink_info_table.drink_name, drink_info_table.price, drink_info_table.path, drink_info_table.status,stock_table.stock
        FROM drink_info_table
        JOIN stock_table
        ON drink_info_table.drink_id = stock_table.drink_id';
        $data = [];
        if ($result = mysqli_query($link, $sql)) {
            while ($row = mysqli_fetch_array($result)) {
                $data[] = $row;
            }
        } else {
            $err_msg[] = 'データの抽出に失敗しました';
        }
        return $data;
    }
    
    function id_check() {
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    
            $purchase_time = date('Y-m-d H:i:s');
    
            if (isset($_POST['drink_id']) === TRUE) {
    
                switch (TRUE) {
                    case ($_POST['drink_id'] === ''):
                        $err_msg[] = 'index.phpからdrink_idを受信できませんでした';
                        break;
                    case ($_POST['drink_id'] === NULL):
                        $err_msg[] = 'index.phpからdrink_idを受信できませんでした';
                        break;
                    default:
                        $drink_id = (int) $_POST['drink_id'];
                        break;
                }
            } else {
                $err_msg[] = '商品を選択してください';
            }
    
            if (isset($_POST['money']) === TRUE) {
    
                switch (TRUE) {
                    case ($_POST['money'] === ''):
                        $err_msg[] = '金額を入力してください';
                        break;
                    case ($_POST['money'] === NULL):
                        $err_msg[] = 'index.phpからmoneyを受信できませんでした';
                        break;
                    case (preg_match('/^[0-9]+$/', cut($_POST['money'])) !== 1):
                        $err_msg[] = '金額は0以上の半角整数を入力してください';
                        break;
                    default:
                        $money = (int) cut($_POST['money']);
                        break;
                }
            }
    
            if (count($err_msg) === 0) {
    
                $sql = 'SELECT drink_info_table.drink_name, drink_info_table.price, drink_info_table.path, drink_info_table.status, stock_table.stock
                FROM drink_info_table
                JOIN stock_table
                ON drink_info_table.drink_id = stock_table.drink_id
                WHERE drink_info_table.drink_id = ' . $drink_id;
    
                if ($result = mysqli_query($link, $sql)) {
    
                    while ($row = mysqli_fetch_array($result)) {
                        $data[] = $row;
                    }
                } else {
                    $err_msg[] = '情報の取得に失敗しました';
                }
    
                foreach ($data as $info) {
    
                    $drink_name = $info['drink_name'];
                    $price = (int) $info['price'];
                    $stock = (int) $info['stock'];
                    $path = $info['path'];
                    $status = (int) $info['status'];
    
                    $remaining_stock = $stock - 1;
                    $return = $money - $price;
                }
    
                switch (TRUE) {
                    case ($return < 0):
                        $err_msg[] = 'お金が足りません';
                        break;
                    case ($remaining_stock < 0):
                        $err_msg[] = 'この商品は品切れです';
                        break;
                    case ($status === 0):
                        $err_msg[] = 'この商品は選択できません';
                        break;
                }
    
                $sql = 'UPDATE stock_table SET stock = ' . $remaining_stock . ', updated_at = \'' . $purchase_time . '\' WHERE drink_id = ' . $drink_id;
    
                if ($result = mysqli_query($link, $sql)) {
    
                    $sql = 'INSERT INTO drink_history_table(drink_id, purchased_at) VALUES (' . $drink_id . ', \'' . $purchase_time . '\')';
    
                    if ($result = mysqli_query($link, $sql) !== TRUE) {
                        $err_msg[] = 'drink_history_tableへの追加に失敗しました';
                    }
                } else {
                    $err_msg[] = 'stock_tableの更新に失敗しました';
                
                
                
            }
            return  $err_msg;
            return  $complete_msg;
            
        }
    }
    function html_enc($text){ 
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
    }
    }
    
```

tool.php

```

    <?php
    require_once('../../include/model/functions.php');
    require_once('../../include/conf/const.php');
    $link = get_db_connect();
    $data = insert_drink($link);
    $data = do_sql($link);
    require_once('../../include/view/tool2.php');
    
    $data =  [
                    'drink_name' => '',
                    'price' => '',
                    'created_at' => '',
                    'updated_at' => '',
                    'status' => '',
                    'path'  => ''
                ];
    
    
    close_db_connect($link);
    
```

tool2.php

```

    <!DOCTYPE html>
    <html lang="ja">
    
    <head>
        <meta charset="UTF-8">
        <title>自動販売機商品管理</title>
    </head>
    
    <body>
    
        <?php if (count($complete_msg) !== 0) {
            foreach ($complete_msg as $complete) { ?>
                <p><?php print $complete; ?></p>
        <?php }
        } ?>
    
        <?php if (count($err_msg) !== 0) {
            foreach ($err_msg as $err) { ?>
                <p><?php print $err; ?></p>
        <?php }
        } ?>
    
        <h1>自動販売機管理ツール</h1>
    
        <section>
            <h2>新規商品追加</h2>
    
            <form action="tool.php" method="post" enctype="multipart/form-data">
                <label>名前: <input type="text" name="new_name" size="30" /></label><br>
                <label>値段: <input type="text" name="new_price" size="30" /></label><br>
                <label>個数: <input type="text" name="new_stock" size="30" /></label><br>
                <input type="file" name="new_img" accept="image/jpeg, image/png, image/gif" /><br>
                <select name="new_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" 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 ($data as $list) {
                            if ((int) $list['status'] === 0) { ?>
                                <tr class="status_0">
                                <?php } else { ?>
                                <tr>
                                <?php } ?>
                                <td><img class="image" src="<?PHP print $list['path']; ?>"></td>
                                <? php print htmlspecialchars($list,ENT_QUOTES,'UTF-8'); ?>
                                <td class="d_name"><?php print $list['drink_name']; ?></td>
                                <td class="d_price"><?php print $list['price']; ?></td>
                                <td>
                                    <form method="post">
                                        <input type="text" class="input_text_width text_align_right" name="update_stock" value="<?php print $list['stock']; ?>">個
                                        <br>
                                        <input type="submit" value="変更">
                                        <input type="hidden" name="drink_id" value="<?php print $list['drink_id']; ?>">
                                        <input type="hidden" name="sql_kind" value="update">
                                    </form>
                                </td>
    
                                <?php if ((int) $list['status'] === 0) { ?>
                                    <td class="d_status">
                                        <form method="post">
                                            <input type="submit" value="非公開 → 公開">
                                            <input type="hidden" name="change_status" value="1">
                                            <input type="hidden" name="drink_id" value="<?php print $list['drink_id']; ?>">
                                            <input type="hidden" name="sql_kind" value="change">
                                        </form>
                                    </td>
                                </tr>
                            <?php } else { ?>
                                <td class="d_status">
                                    <form method="post">
                                        <input type="submit" value="公開 → 非公開">
                                        <input type="hidden" name="change_status" value="0">
                                        <input type="hidden" name="drink_id" value="<?php print $list['drink_id']; ?>">
                                        <input type="hidden" name="sql_kind" value="change">
                                    </form>
                                </td>
                                </tr>
                    <?php }
                            }
                        } ?>
    
                </tbody>
            </table>
        </section>
    </body>
    
    </html>
    
```

const.php

```

    <?php
    $uploaddir = './drink_picture/';
    $err_msg = [];
    $complete_msg = [];
    
    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');
    
```

tool2.phpの$complete_msgと$err_msg両方をvar_dumpしたところ、emptyでした。  
functions.phpでreturnしたものをtool2.phpで格納すればいいと思うのですが、  
その格納の仕方がわかりません。  
お手数をおかけしますがどなたかご教授お願い致します。
CC BY-SA 4.0
2021-08-16T06:00:13.443
80837
2021-08-17T02:17:56.357
2021-08-16T08:24:21.813
3060
46886
question
php
returnしたデータの格納方法について
答えをそのまま書いてもPHPの学習の意味はなく理解は進まないと思いますので  
考え方と方針だけ回答しておきます。

まずはPHPの[ユーザ定義関数](https://www.php.net/manual/ja/functions.user-
defined.php)の使い方および[変数のスコープ](https://www.php.net/manual/ja/language.variables.scope.php)を理解する必要があります。

PHPにおける関数ではreturn文を利用して返り値を返さない限りは関数から返ってきません。  
また「関数の中の変数」と「関数の外の変数」はスコープの関係で別物です。  
※講義や学習の最初に学ぶ内容かとおもいますのでお手持ちのテキストやWeb講座を振り返ってみてください。

そのうえでソースを確認すると  
insert_drinkの中身を見るとほとんどreturn文が記述されていないです。

以下簡略化したソースで説明します。

```

    $err_msg = [];//宣言（A）
    function insert_drink() {
      $err_msg[] = '商品名を入力してください';
      //同じ名前の変数でもスコープが違うので（A）で宣言した変数には入らない
    }
    
    insert_drink();
    vardump($err_msg)//これは空
    
```

そこで以下のようにreturn文で関数から値を返してもらうとよいでしょう。

```

    $err_msg = [];
    function insert_drink() {
      $err_msg[] = '商品名を入力してください';
      return $err_msg;//追記
    }
    
    $err_msg = insert_drink();//代入しないと受け取れないので変数に代入を忘れずに！
    vardump($err_msg)//これは正しく表示されるはず
    
```

insert_drink()の中できちんとreturnをする。  
returnされた値をきちんと受け取って利用する。  
そちらを意識してもう一度関数とそれを利用する周りの処理を書き直してみてください。
CC BY-SA 4.0
2021-08-17T01:33:41.543
80859
2021-08-17T02:17:56.357
2021-08-17T02:17:56.357
3060
22665
80837
answer