PHP+MySQLでショッピングサイトの在庫処理におけるカートの販売数の管理方法

このQ&Aのポイント
  • PHP+MySQLでショッピングサイトを構築している際に、カートの在庫処理について悩んでいます。
  • 商品をカートに追加すると、DBの在庫テーブルの販売数を増やし、在庫数に即時に反映させたいと考えています。
  • しかし、ブラウザを閉じた時やセッションタイムアウト時、ログアウト時に確定していないカートの商品については販売数を元に戻したいです。
回答を見る
  • ベストアンサー

学校の授業で困っていることがあります。PHP+MySQLでショッピング

学校の授業で困っていることがあります。PHP+MySQLでショッピングサイトを構築しているのですが、カートの在庫処理の部分で疑問が発生しました。 私たちのショッピングサイトは、カートに商品を追加した時点で、DBの在庫テーブルの販売数を増やし、在庫数に即時に反映させたいと考えています。 しかし、ブラウザを閉じた時やセッションタイムアウト時、ログアウト時に確定していないカートの商品については販売数を元に戻したいのです。 ログアウト時は明示的に行えると思うのですが、セッションタイムアウト時、ブラウザを閉じた時の処理はどのようにすればいいのですか? そのようなイベントを取得するメソッドや方法はないのでしょうか? 参考サイトや方法を教えてください!

  • PHP
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

カートのデータ用のテーブルを用意します。 主キーはセッションIDにするか、ユニークなカートIDを発行し商品データと一緒に保存します。 セッションにはカートIDのみ保持します。 そしてセッションは切れても在庫は戻らないので、未購入のまま放置されてるカートを開放するプログラムを実装します。 ユーザーのアクセス毎にやってると負荷が気になるかもしれませんがそこはサジ加減で決めてください。 if(mt_rand(1,10) === 10){ //解放処理行うとか。 } ただあまり稀にしてしまうと、解放対象がいつまでも残りユーザーが買えないのでなるべくユーザーのアクセス毎に実行したほうがいいです。 カート解放のプログラムはカートを生成してxx分以上経過していたら削除する、最後に商品 を追加してからxx分以上経過していたら削除する等ルールを決め実装します。 もちろん削除前に在庫は戻してください。 カートが解放されたことをユーザーにアナウンスしたい場合は商品データを削除後、解放しましたflagを立てるやセッションにメッセージを持つ、リダイレクトさせるなどの実装があります。 解放プログラムはプログラムの前のほうで実行するようにしてください。理由はフローチャートでも書けばわかると思います。 ちなみにカートに入れた段階で販売数を増やすのは設計として良いと思えません(売上計算上的な意味で) たとえばスーパーでカートに入れてもそれは販売したことにはなりませんよね?またスーパーが持っている在庫が減るわけでもないです。 お客さんが確保できる在庫が減るだけですね。 ということで、販売用在庫・実在庫・販売数は別の概念で考えましょう。

FUllppp
質問者

お礼

助かりました。参考にさせて頂きます。 ありがとうございました。

その他の回答 (3)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

ただの参考意見ですので、聞き流してください。 中身の事は知らないので、実際の動作を見ての判断ですが、楽天のショッピングカートは注文を送信した時点で、在庫から数量が減る仕組みみたいです。 ぶっちゃけ これだと 同じ時間にカートに入れても、注文が一歩遅いと在庫切れになってしまってる人もいたりするわけですが。 なので、注文時の楽天の自動返信メールには、「ショップからの注文確定のメールが来るまで振り込まないでください」みたいな事が書かれています。 楽天でも採用している この方式が 実はベストなやり方なのかもしれません。

  • dalianse
  • ベストアンサー率35% (7/20)
回答No.2

販売数を増やしたタイミングをDBに保存しておき、たとえば30分経っても販売が確定していなかったら元に戻すプログラムをcronで定期的に実行する、というのはどうでしょう。

FUllppp
質問者

補足

「cron php」で検索しました。データベースのバックアップ等自動的にして欲しい時に使うもののようですが、1つ疑問があります。 Aさんが12:00に買い物かごに商品をいれて此処で言う販売数を減らしたとします。そのタイミングをDBに保存しておきます。 その後、12:30にBさんが買い物かごに商品をいれて、販売数を減らしたとします。 そして、Aさんが追加後30分を経過し、12:00の状態にもどすと、 Bさんの販売数は反映されなくなってしまうではないでしょうか? 私の勘違いだったらすいません・・

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>カートに商品を追加した時点で、DBの在庫テーブルの販売数を増やし 在庫数と受注数を別にもてばいいです。 なお注文は販売ではありません。販売が確定するまで販売数は増やしてはいけません。 受注数を増やし、その結果、余裕数が1減るという処理になります。 実際には受注を販売に変更するためには、受注引当、在庫引落、売上確定処理が必要になります。

FUllppp
質問者

補足

質問に書いた販売数というのは回答者さんがおっしゃっている受注数のことです。 回答者さんの言われている通り、在庫数と受注数を持っていて、カートに入れると受注数を増やすしくみです。 在庫数-受注数で商品ページの在庫数を表示するようにしています。

関連するQ&A

  • PHP+MySQLのショッピングカートについて

    PHP+MySQLのショッピングカートについて 宜しくお願いします。 PHP4.4.1+MySQL4.1.15でショッピングサイトを構築しております。 このサイトはPCと携帯に対応させるように構築しております。 携帯でも購入出来る様にする為に、カートはCOOKIEでは無く、SESSIONに依存しております。 ユーザが商品を選択すると、SESSIONに商品IDや、ユーザの選択した内容が格納されます。 複数の商品ID、選択内容を格納させる為に多次元配列にて格納しております。 買い物が終わり決算する時に、個人情報を入力し、確認ページ表示後にMySQLのDBに個人情報と選択項目をそれぞれinsertしていきます。 商品情報については、カートに入れた商品数分を繰り返し処理を行い、1レコードずつinsertしていきます。 MySQLのDBに書き込み後、自動返信にてメールを店舗とユーザに送信しています。 この様なシステムで、問題が発生しております。 決算後、個人情報、商品情報が欠落している場合があります。DBにも自動返信メールにも明記されず、スッポリ無くなっているのです。 それも、全データではなく、個人情報の電話番号だけとか、商品情報の選択項目の1つだけといった具合です。 毎回ではなく、ときどき現れます。 これはプログラムの問題なのでしょうか?それとも、サーバの処理能力の問題で、同時アクセス時に起きている現象なのでしょうか? 私の環境下では何度テストしても現象が現れない為に、原因が分からず悩んでおります。

    • ベストアンサー
    • PHP
  • ショッピングカートのセッション処理について。

    いつも拝見し大変お世話になっております。 現在ショッピングカートを作成しておりますが、商品購入画面から”購入する”のボタンを押したときに、購入する商品ID,注文数量、サイズ、商品価格をセッションとして 格納したいのですがうまくいかず困っております。 使用PHPバージョンは4.4です ソースは以下のとおりです。 //購入するのボタンを押したときの処理 if (isSet($_POST['cart']){ $_SESSION['cart'][$_POST(商品コード)] =+$_POST(商品価格); //↑セッション格納ここまで //(テスト)格納したデータを表示 print_r($_SESSION['cart']); } いろいろと調べて該当する商品コードと値段は 格納することができたのですが、その他の商品購入数などをデータにさらに格納する時どうすればいいかわかりませんでした。 お忙しい中大変申し訳ございませんがお知恵をお貸しいただけますでしょうか?よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ショッピングカートのプログラムでDB使いますか?

    ショッピングサイトでカートを作る際、サーバのセッションに商品IDなどを持たせますか?それともtmpDBなどに一時的な情報を持たせますか? サイトの規模や種類、アクセス数、ハードウェアなどにより状況は異なると思いますが、一般的にどちらが多いのでしょうか?

  • 現在FC2ショッピングカートを利用しています。

    現在FC2ショッピングカートを利用しています。 登録商品の一覧から商品を選択し、 最大注文数、在庫数共に【0】と入力し 在庫の表示方法を【在庫が無い場合は…お問い合わせ下さい】としているのに カートプレビューで確認しても 在庫があるように表示されています。 デモでカートに入れてみても入ります。 何故でしょうか? 最大注文数、在庫数共に【0】と入力したら在庫が無い事にはならないのでしょうか? 在庫無しにする場合にはどうしたらよいのでしょうか?

  • [PHP]セッション破棄について

    はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • 刃物販売のショッピングサイトの許可

    刃物販売の業者を集めた、ショッピングサイトを開設する場合、許可は必要ですか? 当方で在庫は持ちませんが、ショッピングカートは設置して、サイト内で買い物出来る様にします。

  • WEBショッピングサイトのカートの識別について

    現在、WEBでショッピングできるサイトをPHPで作成しています。 購入者が「カートに入れる」ボタンを押した時に、カートの番号を生成して同一人である判断をしようと思っています。 今回のサイトは会員制ではないのでログインはしません。そこで、カートの番号をどう採番したらよいか迷っています。 1.採番テーブルを持ち採番(連番)する。 2.グローバルIPアドレスをシリアス値に変換して使用する。 今は2.の案で行こうと考えていますが実際の運用時での問題点が有るのでしょうか。 もしグローバルIPアドレスが操作途中で変更となればセッション切れのエラーとし、 また、カートの番号は生成して2時間でタイムアウトにします。 なお、1.2.以外で一般的にはこのようにしているものが有れば合わせて教えて頂ければ幸いです。 よろしくお願いします。

  • PHPでログイン人数を制限したい

    PHPを用いたサイトを作っています。 ログイン人数の制限を行いたいのですが、どのように実現すればいいのか分からず困っています。何か良い方法を知っている方がいらっしゃったら教えていただきたく思います。お願いします。 ログイン時にセッション数を取得できれば、その時に最大人数を超えていればログインさせない、という方法でいけそうなのですが、セッション数を取得する関数はあるでしょうか? ちょっと調べたところでは分かりませんでした。 別の方法としてはログイン時にログイン人数をカウントアップしてDBかファイルに保存しておき、最大人数を超えた場合はログインさせない。ログアウト時はカウントダウンするという方法も考えましたが、問題はウィンドウを×ボタンで閉じられた場合と、タイムアウトでログインが終了した場合に、カウントダウンの処理をする方法が分かりません。そんな方法はありますでしょうか。 よい知恵を持っている方がいらっしゃったらよろしくお願いします。

    • ベストアンサー
    • PHP
  • ショッピングカートについて

    ショッピングカートについて いつもお世話になってます。以前ネットショップに関してご質問したのですが、再度ショッピングカートについてご質問させて頂きます!! 現在、ビルダーでHPを作ってるのですが、ショッピングカートで悩んでます。 ショッピングカートで検索し、色々なサイトを見たんですが、 ショッピングカート付きのホームページも簡単に作成できる…のような、サイトが多々あります。 自分で作成したものに、カートをつけるようなことができるショッピングカートはありませんか? また、ネットショップ初心者なので、どうすればいいのか少し頭の中がごちゃごちゃになってます;;; なるべく簡単にわかりやすく説明していただくとありがたいです!! また商品数が35くらいなんですが、 この場合、商品ページを自分で作るのはかなりの時間がかかりますでしょうか? その他、 送料の細かい計算ができれば尚ありがたいです。 例えば、通常送料が1000円だったとして、セット商品の場合は500円になったり、送料無料の商品と同梱の場合、送料無料が繁栄される、 というような感じの細かい設定ができればなと思ってます。 決済方法は、 代金引換とクレジットカード決済の二つです。 説明不足がたくさんあります? と、いうより説明が意味不明かもしれませんが、理解できる方ご返答よろしくお願いします。

  • 現在、レンタルサーバ(コアサーバー)上でPHP5とmysqlでサイトへ

    現在、レンタルサーバ(コアサーバー)上でPHP5とmysqlでサイトへのアクセス数とサイト上の複数のリンク先へのクリック数のログを取得し、一日一回それらを一つのテーブルへ集計し、レポート表示させるプログラムを作成しました。 一日のログが少なかった頃は問題なく動いていたのですが、一日のログ数が10万を超えた辺りから集計処理がタイムアウトしてしまい、集計ができなくなってしまいました。 下記のようなイメージで集計プログラムとして動かしています。 ループ数は25,000回位です。 ループ中にはmysqlからの読み込みと書き込み処理を含んでおります。 $i = "0"; do{//サイト数だけループ $cat_i = "0"; do{//カテゴリ数だけループ $carrier = "0"; do{ $cl_i = "1"; do{ }while($cl_i < 21);    $carrier = $carrier + 1;          }while($carrier < 3); $cat_i = $cat_i + 1; }while($cat_i < $rows_cat); $i = $i + 1; }while($i < $rows_clsite); PHPを触り始めて日が浅いもので、ループを多用して重い処理になっているのはわかっております…。 コードの書き方自体もなっていないと思いますが、タイムアウトせずに動かせなく困っておりまして、アドバイスを頂ければと思っております。 PHP・ブラウザのタイムアウト対策は、 set_time_limit(0); ob_end_clean(); echo str_pad('',256); flush(); sleep(1); としており、上記で暫くは処理時間を伸ばすことができておりました。 また、phpがapachユーザー?として動く為、apachのタイムアウトに引っかかるのではと、コアサーバーのサイトに記載されていた、CGI版PHPとして動かす方法(.htaccessに記載する方法)でも試してみたのですが、結果は変わりませんでした。 しかし、本当にCGI版として動いているのか確信はありません。。 試行錯誤の上、上記のループの$iの部分を1回終了毎にブラウザに戻し、metaのRefreshで15秒開け次の処理を行わせたり、$iのループ毎に手動でPOSTにて送信し、細切れにして処理をさせているのですが、細切れにした処理だけでもタイムアウトになったりならなかったりを繰り返しております。 上記の方法では、ブラウザのタイムアウト対策をしているだけではと思いつつも、原因がどこにあるのか思い当たらない為、どう対処していいのかさえわからない状況となっております。。 単純に、apachのタイムアウトに引っかかっているのか、負荷が大きいためなんらかのサーバの制限に引っかかっているのか等、考えられる原因やその原因を一つ一つ切り捨てていけるような方法等がありましたら、ご意見お願いできればと思います。 自前のサーバの準備も進めておりますが、暫く時間がかかってしまいそうですので、現在の環境で応急処置できればと思っております。 タイムアウト時はphpなどのエラーメッセージは出ず、IEの「このページは表示できません。」というメッセージが表示されております。 乱文にて申し訳ありませんが、お知恵をお貸し頂けますと大変幸いでございます。 宜しくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう