Php 如何防止某人使用促销代码两次?
我有一个如下所示的数据库: 当用户想要使用促销代码时,它首先检查used\u promo是否为空,这意味着用户以前没有使用过任何促销代码。(用户只能使用1个促销代码) 我可以这样做Php 如何防止某人使用促销代码两次?,php,postgresql,Php,Postgresql,我有一个如下所示的数据库: 当用户想要使用促销代码时,它首先检查used\u promo是否为空,这意味着用户以前没有使用过任何促销代码。(用户只能使用1个促销代码) 我可以这样做 SELECT used_promo FROM users WHERE id=5 然后我可以用PHP检查used_promo是否为空,如果为空,我可以这样做 UPDATE users SET used_promo=2, balance=balance+100 WHERE id=5 用户是否可能同时尝试多次使用促销
SELECT used_promo FROM users WHERE id=5
然后我可以用PHP检查used_promo是否为空,如果为空,我可以这样做
UPDATE users SET used_promo=2, balance=balance+100 WHERE id=5
用户是否可能同时尝试多次使用促销代码,选择将返回已使用的促销在设置为2之前为空,并且余额将被多次添加?创建一个多关系表“已使用促销”,其中列为:
希望这有帮助。在您描述的场景中,理论上可以多次使用促销代码。使用单个查询,如果更新成功或没有行,则将返回id
UPDATE users
SET used_promo=2, balance=balance+100
WHERE id=5 AND used_promo is null
RETURNING id;
据了解,您担心用户可能会在更新used_promo列之前多次使用promo代码。我不知道你们的商业模式是什么。但是,在这样的场景中是可能的: 用户输入促销代码。您可以相应地降低商品的价格,但由于购买尚未完成,因此无法更新“已使用促销”字段。在未完成购买的情况下,用户输入另一种产品的促销代码并再次获得折扣。在多次这样做之后,用户就可以完成购买了。由于在最后一步没有检查代码的有效性,用户可以获得所有的降价 所以
- 维护促销代码的有效状态
- 始终检查有效性
- 使用原子方式更新有效性状态,使用促销并完成购买。(交易) 在完成购买前使用促销代码和促销