🎄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

2回答

943閲覧

PHPのtry~catch文

turtle410

総合スコア13

HTML5

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

PHP

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

0グッド

1クリップ

投稿2021/01/24 05:12

前提・実現したいこと

自動販売機で、購入した結果を表示するプログラム(購入結果ページ)を作成しています。
mysqliの部分をtry~catch文に修正する場合、どの部分を訂正すればいいですか?

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

エラーメッセージは特にありません。

該当のソースコード

PHP

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

試したこと

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

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

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

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

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

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

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

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

guest

回答2

0

例外にもいろいろあるので「どこでどういう例外をキャッチしたいか」次第です。
例外(exceptions)
機能によってthrowする例外も違いますし、自らthrowすることもできます。
PDO:エラーおよびエラー処理

mysqli_sql_exception
いずれにしても親はExceptionですが、何でもかんでも
Exceptionにするのではなく、明示した方が実装としては堅牢です。

投稿2021/01/24 07:23

m.ts10806

総合スコア80875

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

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

0

ケースバイケースじゃないでしょうか? 最低限とするならデータベースに問い合わせる行や書き込む行だけでいいと思いますが、トランザクション処理とか絡むとある程度大きいくくりにした方が良い場合もあります。

まずは自分で色々と試してみて、データベースをわざと終了させてみたり、トランザクションを失敗させるなどしてみてどういう例外が発生してどういう状況になるかを色々と試してみるといいと思います。

投稿2021/01/24 05:27

AbeTakashi

総合スコア4848

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問