トランザクション処理で、
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で質問しましょう!
似たような質問が見つかりました
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- MySQL MYSQL エラー 2 2022/10/18 11:37
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MySQLでデータベースにデータin...
-
ヒアドキュメントでSQLを書く事...
-
ランクの順位変動について
-
リストボックスについて
-
OracleからAccessへのインポート
-
外部結合で参照列が複数あるSQL
-
PhpMyAdmin
-
phpのデータベースへの接続
-
出勤表の作り方
-
予約システム
-
変数にNULLを代入したい
-
数字がリアルタイムで参照でき...
-
PHP+MYSQLでレコードをランダ...
-
MDB2エラーが対応出来ません。
-
ResultSetインターフェイスでの...
-
実行時エラー3131 FROM 句の構...
-
エクセルVBAについて
-
JAVA SQLServerException 列名 ...
-
単純ですが、意外と穴?なデー...
-
PHPで[]の使い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
トランザクション処理
-
MySQLでデータベースにデータin...
-
PHPシステムでSQLのUPDATEがあ...
-
変数にNULLを代入したい
-
phpにて出欠登録管理を作成して...
-
csvをDBへ読み込んだら、NULLが...
-
php sqlite count 列数取得
-
クエリObjectをforeachで回す時...
-
PHPでフォームからデータDBに書...
-
DB Error: no such field
-
日またぎの計算
-
OracleからAccessへのインポート
-
PHPでいいね機能を作りたいので...
-
PHP PDOを利用してカラムの削除...
-
PHPでPostgreSQLのテーブルを表...
-
SQLで返り値が空とでる
-
PHP prepare フィールド名をエ...
-
PHPでmySQLのテーブルを作成したい
-
外部結合で参照列が複数あるSQL
-
MDB2エラーが対応出来ません。
おすすめ情報