如何防止有人使用促销代码两次?

时间:2017-05-21 14:05:27

标签: php postgresql

我有一个如下所示的数据库:

database

当用户想要使用促销代码时,它首先检查 used_promo 是否为空,这意味着用户之前没有使用任何促销代码。 (用户只能使用1个促销代码)

我可以做这样的事情

SELECT used_promo FROM users WHERE id=5

然后我可以用PHP查看used_promo是否为null,如果是,我可以

UPDATE users SET used_promo=2, balance=balance+100 WHERE id=5

用户是否可以尝试多次同时使用促销代码,SELECT将返回 used_promo 在设置为2之前为空并且将添加余额多次?

3 个答案:

答案 0 :(得分:1)

再创建一个关系表“promo_used”,其中列为:

  1. ID
  2. USER_ID
  3. promo_code_id
  4. 时间戳
  5. 一旦用户申请促销代码,此表格将有新条目。这样,如果用户再次尝试应用相同的促销代码,我们可以通过搜索此表进行检查。

    希望这有帮助。

答案 1 :(得分:1)

在您所描述的场景中,理论上可以多次使用促销代码。使用单个查询,如果更新成功则返回id,否则返回否。

UPDATE users 
SET used_promo=2, balance=balance+100 
WHERE id=5 AND used_promo is null
RETURNING id;

答案 2 :(得分:0)

据了解,您担心用户可能会在更新used_promo列之前多次使用促销代码。我不知道你的商业模式是什么。但是,在这样的场景中有可能:

  

用户输入促销代码。您相应地降低了商品的价格,但由于购买不完整,您无法更新used_promo字段。如果没有完成购买,用户输入另一个产品的促销代码并再次获得减少。多次执行此操作后,用户即可完成购买。由于您不会在最后一步检查代码的有效性,因此用户可以降低所有价格。

所以

  • 维护促销代码的有效性状态
  • 始终检查有效性
  • 使用原子方式更新有效性状态,used_promo并完成购买。 (交易)

    最终购买前的促销代码和used_promo