トランザクション処理
トランザクション処理で、
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();
}
お礼
回答頂きありがとうございました。 インサートの時にsave()を使用せず、違った方法で追加を行なうとエラーにならなくなったので、回答頂いた内容のことが起こっているのだと思われます。 本当にありがとうございました。