前提・実現したいこと
初めて投稿させていただきます。
初学者で至らない点が多々あるかと思いますがよろしくお願いいたします。
現在PHPで自動販売機のシステムを作っております。
購入結果ページにて
購入ページで商品を選択するときはエラーが出ないのですが
未選択で購入ボタンを押すとdrink_idが未定義とエラーが出てきてしまいます。
発生している問題・エラーメッセージ
Notice: Undefined index: drink_id in /home/ec2-user/environment/htdocs/drink/result.php on line 19
該当のソースコード
<!--購入結果ページ result.php--> <?php $host = ''; //ホスト名 $user = ''; //ユーザー名 $passwd = ''; //パスワード $dbname = ''; //データベース名 $link = mysqli_connect($host, $user, $passwd, $dbname); $err_msg = []; $drink_id = ''; if($link) { // 文字化け防止 mysqli_set_charset($link, 'utf8'); //POST情報が入っていたら if($_SERVER['REQUEST_METHOD'] === 'POST') { // drink_idを取得 $drink_id = $_POST['drink_id']; // 商品情報を取得 $sql = "SELECT drink_info_table.drink_id, img, drink_name, price, open_status, stock_number FROM drink_info_table JOIN inventory_control_table ON drink_info_table.drink_id = inventory_control_table.drink_id WHERE drink_info_table.drink_id = '$drink_id'"; //クエリ実行 if($result = mysqli_query($link, $sql)) { // 情報を各変数へ代入 $row = mysqli_fetch_array($result); $price = (int)$row['price']; $img = $row['img']; $drink_name = $row['drink_name']; $stock_number = (int)$row['stock_number']; $open_status = (int)$row['open_status']; $money = $_POST['money']; // エラーチェック // 商品未選択 if(empty($drink_id) === TRUE) { $err_msg[] = '商品を選択してください'; } // 金額入ってない if($money === '') { $err_msg[] = 'お金が投入されていません'; // 金額が足りない }else if ($money < $price) { $err_msg[] = 'お金が足りません'; // 整数以外が入力 }else if(preg_match('/^[0-9]+$/', $money) !== 1) { $err_msg[] = '投入金額は0以上の整数を入力してください'; } // 購入ページを開いた後に在庫0になった if($stock_number <= 0) { $err_msg[] = '在庫が切れました'; } // 購入ページを開いた後にステータス0になった if($open_status === 0) { $err_msg[] = '公開出来なくなりました'; } // エラーがなければ if(count($err_msg) === 0) { // オートコミット mysqli_autocommit($link, false); // 残金計算 $change = $money - $price; // 在庫1本減らす $sql = "UPDATE inventory_control_table SET stock_number = stock_number - 1 WHERE drink_id = '$drink_id'"; // クエリの実行 if(mysqli_query($link, $sql) === TRUE) { // 購入履歴追記 $sql = "INSERT INTO drink_order_table (drink_id, purchase_date) VALUES ($drink_id, now())"; // クエリが実行出来なかったら if(mysqli_query($link, $sql) !== TRUE) { // エラー $err_msg[] = 'drink_order_table: UPDATEエラー:' . $sql; } // エラー }else { $err_msg[] = 'UPDATE inventory_control_table: UPDATEエラー:' . $sql; } // トランザクション成否 if(count($err_msg) === 0) { mysqli_commit($link); }else { mysqli_rollback($link); } } } } }else { $err_msg[] = 'connectエラー' . $link; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>自動販売機_結果</title> </head> <body> <h1>自動販売機結果</h1> <?php foreach($err_msg as $value) { ?> <?php echo $value . "<br>"; ?> <?php } ?> <?php if(count($err_msg) === 0) { ?> <p>がしゃん! <img src="upload/<?php echo $img; ?>"><br> <?php echo $drink_name; ?> が買えました! </p> <p>おつりは <?php echo $change; ?> 円です! </p> <?php } ?> <a href="index.php">戻る</a> </body> </html>
以下、購入ページのコードも念のため記載いたします。
<!--購入ページ index.php--> <?php $host = ''; //ホスト名 $user = ''; //ユーザー名 $passwd = ''; //パスワード $dbname = ''; //データベース名 $link = mysqli_connect($host, $user, $passwd, $dbname); $index_data = []; $err_msg = []; if($link) { mysqli_set_charset($link, 'utf8'); // 自動販売機を表示 // ステータスが1の時に表示する $sql = "SELECT drink_info_table.drink_id, img, drink_name, price, open_status, stock_number FROM drink_info_table JOIN inventory_control_table ON drink_info_table.drink_id = inventory_control_table.drink_id WHERE open_status = 1"; if($result = mysqli_query($link, $sql)) { $i = 0; while($row = mysqli_fetch_array($result)) { $index_data[$i]['drink_id'] = htmlspecialchars($row['drink_id'], ENT_QUOTES, 'UTF-8'); $index_data[$i]['img'] = htmlspecialchars($row['img'], ENT_QUOTES, 'UTF-8'); $index_data[$i]['drink_name'] = htmlspecialchars($row['drink_name'], ENT_QUOTES, 'UTF-8'); $index_data[$i]['price'] = htmlspecialchars($row['price'], ENT_QUOTES, 'UTF-8'); $index_data[$i]['open_status'] = htmlspecialchars($row['open_status'], ENT_QUOTES, 'UTF-8'); $index_data[$i]['stock_number'] = htmlspecialchars($row['stock_number'], ENT_QUOTES, 'UTF-8'); $i++; } }else { $err_msg[] = '取得失敗' . $sql; } mysqli_free_result($result); mysqli_close($link); }else { $err_msg[] = 'error: ' . mysqli_connect_error(); } // var_dump($err_msg); ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>自動販売機_購入</title> <style type="text/css"> .soldout { color: red; font-weight: bold; } </style> </head> <body> <h1>自動販売機</h1> <form method="post" action="result.php"> <p>金額<input type="text" name="money"></p> <table> <?php foreach($index_data as $value) { ?> <tr> <td><img src="upload/<?php echo $value['img']; ?>"></td> </tr> <tr> <td><?php echo $value['drink_name']; ?></td> </tr> <tr> <td><?php echo $value['price']; ?> <?php if($value['stock_number'] <= 0) { ?> <p class="soldout">売り切れ</p> <?php } else { ?> <br><input type="radio" name="drink_id" value="<?php echo $value['drink_id']; ?>"> </td> <?php } ?> </tr> <?php } ?> </table> <input type="submit" value="■□■□■購入■□■□■"> </form> </body> </html>
試したこと
■クエリを実行するときに$drink_idを一緒に取得しないといけないのか?と思い
$drink_id = (int)$row['drink_id'];を記載し再代入してみましたがダメでした。
(※この発想があっているのか分かりません。。)
■isset関数を使用するとエラーが消えるとどこかのWEBページで読んだので
商品未選択エラーの箇所を
(isset($drink_id) !== TRUE) { としてみましたがダメでした。
補足情報(FW/ツールのバージョンなど)
PHPのバージョン:5.6.40
サーバのバージョン: 5.5.62 - MySQL Community Server (GPL)
その他補足が必要なところがございましたらご教示いただければ幸いです。
おそらくすごく初歩的なところの理解が出来ていないがために発生しているエラーだと思っておりますが解決できません。。
ご教示のほどよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー