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

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

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

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

PHP

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

Q&A

解決済

1回答

1668閲覧

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

turtle410

総合スコア13

HTML5

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

PHP

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

0グッド

1クリップ

投稿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

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

試したこと

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/ツールのバージョンなど)

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/25 02:55

示しているphpコードは、ファイル名のどれですか
guest

回答1

0

ベストアンサー

mysqli_query()の実行に失敗したらfalseを返すので、
mysqli_get_warningsとか駆使してエラー内容の把握に努めてください。
var_dump($link);とか失敗時点の処理に臨時に挟んでもいいかも。

投稿2021/01/25 03:00

編集2021/01/25 03:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

turtle410

2021/01/29 08:24

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問