学校の授業で困っていることがあります。PHP+MySQLでショッピングサイトを構築しているのですが、カートの在庫処理の部分で疑問が発生しました。
私たちのショッピングサイトは、カートに商品を追加した時点で、DBの在庫テーブルの販売数を増やし、在庫数に即時に反映させたいと考えています。
しかし、ブラウザを閉じた時やセッションタイムアウト時、ログアウト時に確定していないカートの商品については販売数を元に戻したいのです。
ログアウト時は明示的に行えると思うのですが、セッションタイムアウト時、ブラウザを閉じた時の処理はどのようにすればいいのですか?
そのようなイベントを取得するメソッドや方法はないのでしょうか?
参考サイトや方法を教えてください!
No.4ベストアンサー
- 回答日時:
カートのデータ用のテーブルを用意します。
主キーはセッションIDにするか、ユニークなカートIDを発行し商品データと一緒に保存します。
セッションにはカートIDのみ保持します。
そしてセッションは切れても在庫は戻らないので、未購入のまま放置されてるカートを開放するプログラムを実装します。
ユーザーのアクセス毎にやってると負荷が気になるかもしれませんがそこはサジ加減で決めてください。
if(mt_rand(1,10) === 10){
//解放処理行うとか。
}
ただあまり稀にしてしまうと、解放対象がいつまでも残りユーザーが買えないのでなるべくユーザーのアクセス毎に実行したほうがいいです。
カート解放のプログラムはカートを生成してxx分以上経過していたら削除する、最後に商品
を追加してからxx分以上経過していたら削除する等ルールを決め実装します。
もちろん削除前に在庫は戻してください。
カートが解放されたことをユーザーにアナウンスしたい場合は商品データを削除後、解放しましたflagを立てるやセッションにメッセージを持つ、リダイレクトさせるなどの実装があります。
解放プログラムはプログラムの前のほうで実行するようにしてください。理由はフローチャートでも書けばわかると思います。
ちなみにカートに入れた段階で販売数を増やすのは設計として良いと思えません(売上計算上的な意味で)
たとえばスーパーでカートに入れてもそれは販売したことにはなりませんよね?またスーパーが持っている在庫が減るわけでもないです。
お客さんが確保できる在庫が減るだけですね。
ということで、販売用在庫・実在庫・販売数は別の概念で考えましょう。
No.3
- 回答日時:
ただの参考意見ですので、聞き流してください。
中身の事は知らないので、実際の動作を見ての判断ですが、楽天のショッピングカートは注文を送信した時点で、在庫から数量が減る仕組みみたいです。
ぶっちゃけ これだと 同じ時間にカートに入れても、注文が一歩遅いと在庫切れになってしまってる人もいたりするわけですが。
なので、注文時の楽天の自動返信メールには、「ショップからの注文確定のメールが来るまで振り込まないでください」みたいな事が書かれています。
楽天でも採用している この方式が 実はベストなやり方なのかもしれません。
No.2
- 回答日時:
販売数を増やしたタイミングをDBに保存しておき、たとえば30分経っても販売が確定していなかったら元に戻すプログラムをcronで定期的に実行する、というのはどうでしょう。
この回答への補足
「cron php」で検索しました。データベースのバックアップ等自動的にして欲しい時に使うもののようですが、1つ疑問があります。
Aさんが12:00に買い物かごに商品をいれて此処で言う販売数を減らしたとします。そのタイミングをDBに保存しておきます。
その後、12:30にBさんが買い物かごに商品をいれて、販売数を減らしたとします。
そして、Aさんが追加後30分を経過し、12:00の状態にもどすと、
Bさんの販売数は反映されなくなってしまうではないでしょうか?
私の勘違いだったらすいません・・
No.1
- 回答日時:
>カートに商品を追加した時点で、DBの在庫テーブルの販売数を増やし
在庫数と受注数を別にもてばいいです。
なお注文は販売ではありません。販売が確定するまで販売数は増やしてはいけません。
受注数を増やし、その結果、余裕数が1減るという処理になります。
実際には受注を販売に変更するためには、受注引当、在庫引落、売上確定処理が必要になります。
この回答への補足
質問に書いた販売数というのは回答者さんがおっしゃっている受注数のことです。
回答者さんの言われている通り、在庫数と受注数を持っていて、カートに入れると受注数を増やすしくみです。
在庫数-受注数で商品ページの在庫数を表示するようにしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPのセッション有効期限について 5 2023/06/14 12:40
- ネットスーパー 他人の閲覧履歴消せますか? 2 2022/09/19 04:26
- 確定申告 確定申告の真面目な質問です。 個人事業主で転売屋に毛の生えた事をしています。 販路はメルカリ一択です 1 2023/04/09 22:39
- Yahoo!ショッピング ヤフーショッピング(ペイペイモール/ZOZOTOWN)についての質問です。 もともとカートに入れて置 1 2022/06/19 12:19
- Amazon 新規でAmazon商品ページ作成方法について 1 2022/03/28 00:22
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- 営業・販売・サービス 営業許可の有無について質問させていただきます。 現在、私は父親のもとで食品工場に勤めており、今後私が 2 2023/05/28 09:27
- ZOZOTOWN zozotownでniko and...というブランドのバッグを探してたんですけどなくて、ブラウザ版 2 2023/05/15 18:52
- スーパー・コンビニ 一斉値上 スーパーの食料品 値上や単価の仕組みは? 4 2022/06/01 16:18
- MySQL mysqlがインストールされているのかどうか 1 2023/06/05 14:19
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ログインしたら他からログイン...
-
URLのパラメータをGETのままで...
-
PHPのセッション有効期限について
-
session_cache_limiterの使い方
-
!issetの冒頭の!ビックリマー...
-
複数ページでセッションを使わ...
-
ログイン後HTMLソースを取得には
-
別ブラウザ間でセッションの値...
-
セッションを維持したまま、サ...
-
【PHP】SESSION変数の競合を...
-
PHP cookieの値が更新されない...
-
二重ログイン管理について
-
PHPSESSIDの表示
-
DTOとEntityの差は何ですか。
-
Dosブロンプトでtabを出力したい
-
Yahoo! JAPAN IDを新規取得でき...
-
「取得先」という表現について
-
小数点以下0の非表示
-
オブジェクトの中身の判定(PHP)
-
excel access連携 このテーブル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
PHPのセッション有効期限について
-
ブラウザを閉じた後もセッショ...
-
Sessionの上限について
-
!issetの冒頭の!ビックリマー...
-
ログインしたら他からログイン...
-
セッション ID とセッション名...
-
session_start()で生成されるセ...
-
ログインした掲示板ですが、直...
-
【PHP】SESSION変数の競合を...
-
セッションを維持したまま、サ...
-
セッションのスコープ(有効範...
-
「ログイン機能を持たせる」説...
-
PHP cookieの値が更新されない...
-
別ブラウザ間でセッションの値...
-
リアルタイムカウンター
-
session_cache_limiterの使い方
-
セッション変数の命名規則
-
SESSION情報は、ブラウザを起動...
-
セッション変数にパスワードを...
おすすめ情報