カートに入れるボタンを押したときに、
・同一ユーザー、同一商品があればカート数量をカウントアップする
・もしなければ、新規カートを追加する
処理を追加したいです。
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
になります。
SQL文をどのように記述すればいいですか?
//以下はカートテーブルに入れるときのSQL文です。(他のコードは省略しています。)
$sql = 'INSERT INTO cart(user_id, item_id, amount, create_date, update_date)
VALUES(?, ?, ?, ?, ?)';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $user_id, PDO::PARAM_INT);
$stmt->bindValue(2, $item_id, PDO::PARAM_INT);
$stmt->bindValue(3, 1, PDO::PARAM_INT); //在庫は1にする
$stmt->bindValue(4, $date, PDO::PARAM_STR);
$stmt->bindValue(5, $date, PDO::PARAM_STR);
$stmt->execute();
$msg[] = 'カートに追加しました!';
//以下はproductテーブルからすべて取得するときのSQL文です。
$sql = 'SELECT product.id, name, price, img, status, stock
FROM product
JOIN item_stock
ON product.id = item_stock.stock_id
WHERE status = 1';
// ステータスが1の商品のみを表示する
$stmt = $dbh->prepare($sql);
$stmt->execute();
//レコードを取得する
$rows = $stmt->fetchALL();
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
私なら、user_id と item_id にUNIQUE制約を付けておいて、DUPLICATE(重複)が発生した場合はUPDATEが走るように作るのが楽かな。
https://artisan.hatenablog.com/entry/2017/10/29/ …
検証してませんが、SQLとしては↓こんな雰囲気かと思います。
INSERT INTO cart(user_id, item_id, amount, create_date, update_date)
VALUES(?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
update_date = ?
amount = amount + 1
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- PHP PHP MySql ページング 2 2022/09/20 06:38
- MySQL MYSQL エラー 2 2022/10/18 11:37
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- PHP php エラー 2 2022/10/23 16:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
[MySQL] 3つのテーブルの結合で...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
SQLサーバから、項目の属性(型...
-
上位3位を求めるSQL文は?
-
副問合せの書き方について
-
SQL Left Join で重複を排除す...
-
SQLにて特定の文字を除いた検索...
-
[MySQL] UNIQUE制約の値を更新...
-
Access パラメータクエリをcsv...
-
selectした大量データをinsert...
-
親と子供が複数のSQL取得方法
-
テーブルが5つの時の結合の仕...
-
書籍の内容はまともでしょうか?
-
クエリ表示と、ADOで抽出したレ...
-
【SQL文】Insert into文で文法...
-
VIEWの元のテーブルのindexって...
-
inner joinをすると数がおかし...
-
Mysqlでunionを使った検索速度...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
VIEWの元のテーブルのindexって...
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
select文のwhere句に配列を入れ...
-
sqlで、600行あるテーブルを100...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
Unionした最後にGROUP BYを追加...
-
期間の重複を調べるSQL文につい...
-
クエリ表示と、ADOで抽出したレ...
-
Access パラメータクエリをcsv...
-
PL/SQLの変数について
-
MySQLのDATE型カラム値がNULLの...
-
php+mysqlで複数選択削除について
-
上位3位を求めるSQL文は?
おすすめ情報
自分は以下のやり方で試してみました。
最初にカートに追加する対象商品がすでにカートに入っているかどうか確認する。
$sql = 'SELECT item_id, amount FROM ec_cart WHERE item_id = ? AND user_id = ?';
……$rows = $stmt->fetchAll();
その後 if(empty($rows)) 〜で
「カートに追加の対象商品がすでにカートに入っていない場合」と「カートに入っている場合」でそれぞれSQL文を作る。
これだとかなり長くなりました。