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

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

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

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

PHP

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

解決済

自動販売機の購入結果ページ

turtle410
turtle410

総合スコア0

HTML5

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

PHP

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

1回答

0評価

1クリップ

766閲覧

投稿2021/01/25 02:35

前提・実現したいこと

以下の要件を満たすように自動販売機の購入結果ページを作成しています。
・ドリンクの購入が正常に完了した場合、指定ドリンクの「画像」「商品名」「お釣りの情報」を表示して、指定ドリンクの在庫を減らす(管理ページの在庫数が減っていること)。

・指定ドリンクのステータスを確認し、ステータスが非公開の場合はエラーメッセージを表示して、ドリンクを購入することはできない(確認手順の例は以下になります)。
・購入ページで、ステータスが公開の商品を表示する。
・もう1つのブラウザで管理ページを表示させて、購入予定のステータスが公開である商品について、ステータスを非公開に変更する(ステータスを非公開にする)。
・別のブラウザで開いていた購入ページで、ステータスを非公開に変更した商品を選択して、購入するボタンを押した場合、エラーメッセージが表示されること。

作成するページは
販売するドリンクの追加・変更を行う「管理ページ」
ユーザがドリンクを購入する「購入ページ」
ユーザがドリンクを購入した結果情報を表示する「購入結果ページ」
の3つです。

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

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

そのまま開くと 「購入結果 処理が正しくありません 戻る」 と表示されます。 index.phpで商品を選択してから開くと、 「購入結果 取得失敗SELECT drink_master.drink_id, img, drink_name, price, status, stock FROM drink_master JOIN stock ON drink_master.drink_id = stock.drink_id WHERE drink_master.drink_id = 1 商品が見つかりませんでした 戻る」 と表示されます。 購入ページ側でエラーはありません。

該当のソースコード

PHP

<?php $host = 'localhost'; //ホスト名 $username = '5678843'; //ユーザー名 $password = '5678843'; //パスワード $dbname = '5678843'; //データベース名 $link = mysqli_connect($host, $username, $password, $dbname); $err_msg = []; $drink_data = []; $drink_id = ''; $drink_name = ''; $change = ''; $img = ''; if ($link) { // 文字化け防止 mysqli_set_charset($link, 'utf8'); //POST情報が入っていたら if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['money']) === TRUE) { $money = trim($_POST['money']); } // drink_idを取得 if (isset($_POST['drink_id']) === TRUE) { $drink_id = trim($_POST['drink_id']); } if ($money === '') { $err_msg[] = 'お金が投入されていません'; // 整数以外が入力 } else if(preg_match('/^[0-9]+$/', $money) !== 1) { $err_msg[] = '投入金額は0以上の整数を入力してください'; } if ($drink_id === '') { $err_msg[] = '商品を選択してください'; } else if (preg_match('/^[1-9][0-9]*$/', $drink_id) !== 1) { $err_msg[] = '商品が正しくありません'; } if (count($err_msg) === 0) { // 商品情報を取得 $sql = 'SELECT drink_master.drink_id, img, drink_name, price, status, stock FROM drink_master JOIN stock ON drink_master.drink_id = stock.drink_id WHERE drink_master.drink_id = ' . $drink_id; //クエリ実行 if ($result = mysqli_query($link, $sql)) { while ($row = mysqli_fetch_array($result)) { // print_r($row); // exit; foreach ($row as $key => $value) { $row[$key] = htmlspecialchars($value, ENT_QUOTES, 'UTF-8'); } $drink_data[] = $row; } //foreach文を使ってシンプルに表現する } else { $err_msg[] = '取得失敗' . $sql; } if (count($drink_data) > 0) { // 情報を各変数へ代入 //二重配列 $img = $drink_data[0]['img']; $drink_name = $drink_data[0]['drink_name']; $price = (int)$drink_data[0]['price']; $stock_number = (int)$drink_data[0]['stock']; $open_status = (int)$drink_data[0]['status']; //$money = $_POST['money']; // エラーチェック // 金額が足りない if ((int)$money < $price) { $err_msg[] = 'お金が足りません'; } // 購入ページを開いた後に在庫0になった if ($stock_number <= 0) { $err_msg[] = '在庫が切れました'; } // 購入ページを開いた後にステータス0になった if ($open_status !== 1) { $err_msg[] = '公開出来なくなりました・・・・'; } } else { $err_msg[] = '商品が見つかりませんでした'; } } //93行目まではエラーのチェック // エラーがなければ if (count($err_msg) === 0) { // オートコミット mysqli_autocommit($link, false); // 在庫1本減らす $sql = "UPDATE stock SET stock = stock - 1 WHERE drink_id = '$drink_id'"; // クエリの実行 if (mysqli_query($link, $sql) === TRUE) { // 購入履歴追記 $sql = 'INSERT INTO drink_history (drink_id, purchase_date) VALUES (' . $drink_id . ', now())'; // クエリが実行出来なかったら if (mysqli_query($link, $sql) !== TRUE) { // エラー $err_msg[] = 'drink_history: UPDATEエラー:' . $sql; } // エラー } else { $err_msg[] = 'UPDATE drink_stock: UPDATEエラー:' . $sql; } // トランザクション成否 if (count($err_msg) === 0) { mysqli_commit($link); // 残金計算 $change = $money - $price; } else { mysqli_rollback($link); } } } else { $err_msg[] = '処理が正しくありません'; } } else { $err_msg[] = 'connectエラー' . $link; } ?> <!DOCTYPE html> <!--?>とDOCTYPEは改行しない--> <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) { ?> <img src="./drink_picture/<?php echo $img; ?>"> <p>がしゃん!<?php echo $drink_name; ?>が買えました!</p> <p>おつりは<?php echo $change; ?>円です!</p> <?php } ?> <a href="index.php">戻る</a> </body> </html>

試したこと

130円の飲み物を選択して、100円を入力しても1000円を入力しても、
「購入結果  取得失敗SELECT drink_master.drink_id, img, drink_name, price, status, stock FROM drink_master JOIN stock ON drink_master.drink_id = stock.drink_id WHERE drink_master.drink_id = 2
商品が見つかりませんでした 戻る」と同じ画面になります。

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

HTML5

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

PHP

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