前提・実現したいこと
以下の要件を満たすように自動販売機の購入結果ページを作成しています。
・ドリンクの購入が正常に完了した場合、指定ドリンクの「画像」「商品名」「お釣りの情報」を表示して、指定ドリンクの在庫を減らす(管理ページの在庫数が減っていること)。
・指定ドリンクのステータスを確認し、ステータスが非公開の場合はエラーメッセージを表示して、ドリンクを購入することはできない(確認手順の例は以下になります)。
・購入ページで、ステータスが公開の商品を表示する。
・もう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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー