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

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

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

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

Q&A

解決済

1回答

1363閲覧

Laravel decrementで数量の減算時、エラー処理ついて

creative_09

総合スコア80

PHP

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

0グッド

0クリップ

投稿2020/03/25 01:17

laravelで
DBの商品の在庫を減らすとき、
以下のような形で

Product::where('id', $key)->decrement('stock', $value);

数量を減算しています。
ですが、このとき、在庫以上の数量をひこうとした場合、エラーが出ますが、
このエラーをキャッチ?する方法はあるんでしょうか?

エラーが発生した場合は、リダイレクトをかけたいです。

トランザクションでやってみましたが、

DB::beginTransaction(); try { Product_prize::where('id', $key)->decrement('winners', $stock); DB::commit(); } catch (Exeption $e) { DB::rollback(); echo "エラー"; }

テストではリダイレクトではなく、エラーといういう風に表示させているのですが
echo のエラー は表示されません

よろしくおねがいします

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

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

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

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

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

guest

回答1

0

ベストアンサー

Exceptionのつづりが違うのではないでしょうか。
先に条件分岐で処理を入れるのもありかもしれませんね。

投稿2020/03/25 01:54

hayato7

総合スコア1135

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

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

m.ts10806

2020/03/25 02:00

IDE使ってないんでしょうねたぶん。
creative_09

2020/03/25 03:04

綴を直しましたが、echo "エラー"にたどり着けません
hayato7

2020/03/25 03:05

どのようなエラーが発生していますか。
creative_09

2020/03/25 03:10

ありがとうございます。 SQLSTATE[22003]: Numeric value out of range: 1690 BIGINT UNSIGNED value is out of range in と出ています こういったエラーが出た場合にエラーと表示し、リダイレクトしたいです。
creative_09

2020/03/25 03:12

今回のケースの場合、同時購入があった場合に差し引けない在庫をDB側でエラーを出すことで防ぎ、 エラーが出た場合はもう一度最初から在庫を読み直した状態で始めたいのです。 購入の時点で、在庫チェックとその数量以内しか購入できないようにはしてありますが、 同時だと意味がないので、DB側でエラーが出た場合に無効にしようという考えです。
creative_09

2020/03/25 03:19

誰かが参照している間は書き換えない 順番を作れるなどがあればこの問題自体発生しないのかなとか思ってるのですが、 lockForUpdate などがそれに該当するのか、その場合、decrementと併用して書く書き方がわからない そんな感じです
hayato7

2020/03/25 03:47

Exceptionを\Exceptionと書き換えてもダメですかね。 専有ロックなどの知識はまだまだ薄いのでなんとも明言できませんが、lockForUpdateをdecrementの前につけたらできそうな気もします。(検証してないです )
creative_09

2020/03/25 04:26

できました。 Exceptionを\Exceptionと書き換えることで解決しました。 バックスラッシュ・・・・ 専有ロックも試してみたいのですが 動作が把握できないので、処理中のアクセスはどうなるのかなど、 次回チャレンジしてみたいと思います ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問