🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

Q&A

解決済

1回答

2112閲覧

PHPの自動販売機システム

turtle410

総合スコア13

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

0グッド

1クリップ

投稿2021/01/20 03:38

前提・実現したいこと

PHPで自動販売機を制作しています。ユーザーがドリンクを購入した結果情報を表示する「購入結果ページ」( result.php )で、isset関数を使ってif文を修正したいです。現在エラーが3か所あります。

流れは以下のようになります。
「管理ページ(tool.php)」で、 販売する商品の追加をする。
「購入ページ(index.php)」で、購入する商品を選択し、金額を入力して購入する。
「購入結果ページ(result.php)」で、購入した結果を表示する。

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

Notice: Undefined variable: img in /home/ec2-user/environment/htdocs/php/21/result.php on line 120 Call Stack #TimeMemoryFunctionLocation 10.0003245528{main}( ).../result.php:0 "> Notice: Undefined variable: drink_name in /home/ec2-user/environment/htdocs/php/21/result.php on line 121 Notice: Undefined variable: change in /home/ec2-user/environment/htdocs/php/21/result.php on line 125

該当のソースコード

PHP

1<?php 2 $host = 'localhost'; //ホスト名 3 $username = ''; //ユーザー名 4 $password = ''; //パスワード 5 $dbname = ''; //データベース名 6 $link = mysqli_connect($host, $username, $password, $dbname); 7 $err_msg = []; 8 $drink_id = ''; 9// (isset関数を使う) 10 if ($link) { 11 // 文字化け防止 12 mysqli_set_charset($link, 'utf8'); 13 14 //POST情報が入っていたら 15 if ($_SERVER['REQUEST_METHOD'] === 'POST') { 16 // drink_idを取得 17 $drink_id = $_POST['drink_id']; 18 // 商品情報を取得 19 $sql = "SELECT drink_master.drink_id, img, drink_name, price, status, stock 20 FROM drink_master 21 JOIN stock 22 ON drink_master.drink_id = stock.drink_id 23 WHERE drink_master.drink_id = '$drink_id'"; 24 25 //クエリ実行 26 if ($result = mysqli_query($link, $sql)) { 27 // 情報を各変数へ代入 28 $row = mysqli_fetch_array($result); 29 $price = (int)$row['price']; 30 $img = $row['img']; 31 $drink_name = $row['drink_name']; 32 $stock_number = (int)$row['stock']; 33 $open_status = (int)$row['status']; 34 $money = $_POST['money']; 35 36 // エラーチェック 37 // 商品未選択 38 if (count($drink_id) === 0) { 39 $err_msg[] = '商品を選択してください'; 40 } 41 // 金額入ってない 42 if ($money === '') { 43 $err_msg[] = 'お金が投入されていません'; 44 45 // 金額が足りない 46 } 47 else if ($money < $price) { 48 $err_msg[] = 'お金が足りません'; 49 // 整数以外が入力 50 } 51 else if(preg_match('/^[0-9]+$/', $money) !== 1) { 52 $err_msg[] = '投入金額は0以上の整数を入力してください'; 53 } 54 // 購入ページを開いた後に在庫0になった 55 if ($stock_number <= 0) { 56 $err_msg[] = '在庫が切れました'; 57 } 58 // 購入ページを開いた後にステータス0になった 59 if ($open_status === 0) { 60 $err_msg[] = '公開出来なくなりました・・・・'; 61 } 62 63 // エラーがなければ 64 if (count($err_msg) === 0) { 65 // オートコミット 66 mysqli_autocommit($link, false); 67 // 残金計算 68 $change = $money - $price; 69 // 在庫1本減らす 70 $sql = "UPDATE stock 71 SET stock = stock - 1 72 WHERE drink_id = '$drink_id'"; 73 // クエリの実行 74 if (mysqli_query($link, $sql) === TRUE) { 75 // 購入履歴追記 76 $sql = "INSERT INTO drink_history 77 (drink_id, purchase_date) 78 VALUES ($drink_id, now())"; 79 // クエリが実行出来なかったら 80 if (mysqli_query($link, $sql) !== TRUE) { 81 // エラー 82 $err_msg[] = 'drink_history: UPDATEエラー:' . $sql; 83 } 84 // エラー 85 } 86 else { 87 $err_msg[] = 'UPDATE drink_stock: UPDATEエラー:' . $sql; 88 } 89 90 // トランザクション成否 91 if (count($err_msg) === 0) { 92 mysqli_commit($link); 93 } 94 else { 95 mysqli_rollback($link); 96 } 97 } 98 } 99 } 100 } 101 else { 102 $err_msg[] = 'connectエラー' . $link; 103 } 104?> 105 106<!DOCTYPE html> 107<html lang="ja"> 108 <head> 109 <meta charset="UTF-8"> 110 <title>自動販売機 購入結果</title> 111 </head> 112 <body> 113 <h1>購入結果</h1> 114 <?php foreach ($err_msg as $value) { ?> 115 <?php echo $value . "<br>"; ?> 116 <?php } ?> 117 <?php if (count($err_msg) === 0) { ?> 118 <p>がしゃん! 119 <img src="./drink_picture/<?php echo $img; ?>"><br> //1個目のエラー 120 <?php echo $drink_name; ?> //2個目のエラー 121 が買えました! 122 </p> 123 <p>おつりは 124 <?php echo $change; ?> //3個目のエラー 125 円です! 126 </p> 127 <?php } ?> 128 <a href="index.php">戻る</a> 129 </body> 130</html> 131

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2021/01/20 03:48

エラーとNoticeは厳密には違うものです
guest

回答1

0

ベストアンサー

$imgはDBから取り出したデータとなっています
当該行が複数あっても上書きされて最後のデータしか取れないようになっています。
それとは別にmysqlの実行がされないときに$imgは定義されないので
未定義の注意がでるわけです。
noticeをはずすだけならソースの先頭の方で$img="";
のように空文字で初期化しておけばよいでしょう

投稿2021/01/20 03:50

yambejp

総合スコア116661

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問