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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

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

Q&A

解決済

1回答

2002閲覧

PHP自動販売機システム:ラジオボタンで商品未選択購入時に出るUndefined indexエラーを消したいです。

chuntatata

総合スコア1

PHP

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

0グッド

0クリップ

投稿2020/09/10 22:59

前提・実現したいこと

初めて投稿させていただきます。
初学者で至らない点が多々あるかと思いますがよろしくお願いいたします。

現在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)
その他補足が必要なところがございましたらご教示いただければ幸いです。

おそらくすごく初歩的なところの理解が出来ていないがために発生しているエラーだと思っておりますが解決できません。。
ご教示のほどよろしくお願いいたします。

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

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

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

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

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

m.ts10806

2020/09/10 23:02

Undefined index の原因はそう多くはないですので、ひとつひとつ整合性を確かめていけば良いかと思いますが、それよりPHPのバージョンが古い方が気になります。 学習目的ならサポート切れのものを採用するのは悪手ですし、参考書とあわせているのなら参考書を変更すべきです。
chuntatata

2020/09/11 13:20

Undefined indexのエラーの原因は多くないんですね。 確かめてみます!ありがとうございます。 オンラインスクールの課題なのですぐには変更できませんが終わったら新しいバージョンで使ってみます。 ありがとうございます。
m.ts10806

2020/09/11 20:46

なるほど そのオンラインスクールはやめたほうが良いでしょうね。
guest

回答1

0

ベストアンサー

Undefined index: drink_idってことは、変数名ではなく$_POST['drink_id']のインデックス(キー)であるdrink_idが$_POSTにおいて未定義ってことです。

array_key_exists('drink_id', $_POST)でキーの存在をチェックするか、isset($_POST['drink_id'])でキーが存在しなおかつ値がNULLではないことをチェックしてから、値を$drink_idに設定してください。

投稿2020/09/10 23:30

Daregada

総合スコア11990

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

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

chuntatata

2020/09/12 04:45

回答いただきありがとうございました。 無事解決出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問