dポイントプレゼントキャンペーン実施中!

トランザクション処理で、
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件)

ご提示のコードは無茶苦茶ですので、廃棄することをお勧めします。



そもそも仕様が不明確なので、
先ずはフローチャートを書いてはっきりさせましょう。
その過程で考慮すべき問題が浮かび上がってきます。
(例)
1. トランザクション開始
2. ユーザーのカート一覧をDB検索 (排他ロック)
3. カートごとに繰り返し
3a. 販売中の商品か確認 (終売エラー処理が必要か?)
3b. カートの商品IDから在庫一覧をDB検索 (排他ロック)
3c. 在庫毎に減らす数を決定 (各在庫数がマイナスにならない配慮が必要)
3d. 在庫数が足りているか確認 (在庫切れエラー処理が必要か?)
3e. 在庫一覧をDB更新
3f. カートをDB削除
4. トランザクション終了として反映(commit) または 巻き戻し(rollback)

フローチャートができたら、
各項に必要となる計算式やSQLや変数名などの詳細を書き加えましょう。
(例)
"3c. 在庫毎に減らす数を決定" の計算手順
残余 ← カート.数量
foreach 在庫一覧 as 在庫 {
_ 減少数 ← min(残余, 在庫.在庫数)
_ 残余 ← 残余 - 減少数
_ 在庫.在庫数 ← 在庫.在庫数 - 減少数
}

詳細が書けたら、プログラムとして実装しましょう。

実装が出来たら、いろいろな状況のデータを用意して、
プログラムがフローチャート通りに動くか試しましょう。

各工程毎に、終わったら詳しい人に評価してもらいましょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!