
トランザクション処理で、
1.カートの数量を使って商品の在庫数を減算する
2.foreachを使って1商品ずつ取り出し、該当する在庫数を減算する
3.ログインユーザーのカート情報を削除する
の処理を行うには以下のコードをどのように修正すればいいですか?
phpmyadminで作成したテーブル情報は以下の通りです。
cartテーブル(ユーザがカートに追加した商品の情報)が
cart_id, user_id, item_id, amount, create_date, update_date
productテーブル(商品情報)が
id, name, price, img, status, create_date, update_date
item_stockテーブル(在庫情報)が
stock_id, item_id, stock, create_date, update_date
です。
$dbh->beginTransaction();
// cartテーブルとitem_stockテーブル
try {
// 現在ログインしているユーザーのカート情報を削除する
$sql = 'DELETE FROM cart
WHERE user_id = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $user_id, PDO::PARAM_INT);
$stmt->execute();
foreach ($data as $key => $rec) {
$stock = (int)$rec['stock'] - (int)$rec['amount'];
}
// 在庫テーブルを更新
// カートの数量を使って商品の在庫数を減算する
// foreachで1商品ずつ取り出し、該当する在庫数を減算する
$sql = 'UPDATE item_stock
SET stock = ?, update_date = ? WHERE item_id = ?';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $stock, PDO::PARAM_INT);
$stmt->bindValue(2, $date, PDO::PARAM_STR);
$stmt->bindValue(3, $item_id, PDO::PARAM_INT);
$stmt->execute();
$carts = $dbh->commit();
$success_msg[] = '在庫数を更新しました。';
} catch (PDOException $e) {
// ロールバック処理
$dbh->rollback();
$err_msg[] = '在庫数の更新に失敗しました。' . $e->getMessage();
}
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
ご提示のコードは無茶苦茶ですので、廃棄することをお勧めします。
そもそも仕様が不明確なので、
先ずはフローチャートを書いてはっきりさせましょう。
その過程で考慮すべき問題が浮かび上がってきます。
(例)
1. トランザクション開始
2. ユーザーのカート一覧をDB検索 (排他ロック)
3. カートごとに繰り返し
3a. 販売中の商品か確認 (終売エラー処理が必要か?)
3b. カートの商品IDから在庫一覧をDB検索 (排他ロック)
3c. 在庫毎に減らす数を決定 (各在庫数がマイナスにならない配慮が必要)
3d. 在庫数が足りているか確認 (在庫切れエラー処理が必要か?)
3e. 在庫一覧をDB更新
3f. カートをDB削除
4. トランザクション終了として反映(commit) または 巻き戻し(rollback)
フローチャートができたら、
各項に必要となる計算式やSQLや変数名などの詳細を書き加えましょう。
(例)
"3c. 在庫毎に減らす数を決定" の計算手順
残余 ← カート.数量
foreach 在庫一覧 as 在庫 {
_ 減少数 ← min(残余, 在庫.在庫数)
_ 残余 ← 残余 - 減少数
_ 在庫.在庫数 ← 在庫.在庫数 - 減少数
}
詳細が書けたら、プログラムとして実装しましょう。
実装が出来たら、いろいろな状況のデータを用意して、
プログラムがフローチャート通りに動くか試しましょう。
各工程毎に、終わったら詳しい人に評価してもらいましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
フォームで戻った際に入力済み...
-
SplFileObject を利用したとき...
-
csvファイルについて教えて下さ...
-
PHP8でWarning:Undefined varia...
-
PHPSpreadsheetによる書き出し...
-
PHPの変わった閉じタグの必要性...
-
セッション関数を使わずにファ...
-
composerをインストールしたい...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
csvをDBへ読み込んだら、NULLが...
-
Accessへ日付をINSERT
-
変数にNULLを代入したい
-
クエリObjectをforeachで回す時...
-
SQLiteでDBに書き込みできません
-
SQLで返り値が空とでる
-
ヒアドキュメントでSQLを書く事...
-
access → Oracleへのデータ移...
-
月毎の集計値を同じデータグリ...
-
phpを使って、絞り込み検索、条...
-
OracleからAccessへのインポート
-
PHPでいいね機能を作りたいので...
-
php sqlite count 列数取得
-
PHPでPostgreSQLのテーブルを表...
-
会員サイトでログイン後の会員...
-
@コスメのようにユーザーが採...
-
テーブルに行を追加
-
どちらが高速ですか?
-
phpでテーブルを作る際変数によ...
おすすめ情報