Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止某人使用促销代码两次?_Php_Postgresql - Fatal编程技术网

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

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 用户是否可能同时尝试多次使用促销

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

当用户想要使用促销代码时,它首先检查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

用户是否可能同时尝试多次使用促销代码,选择将返回已使用的促销在设置为2之前为空,并且余额将被多次添加?

创建一个多关系表“已使用促销”,其中列为:

  • 身份证
  • 用户id
  • 促销代码
  • 时间戳
  • 一旦用户应用促销代码,此表将有新条目。这样,若用户再次尝试应用相同的促销代码,我们可以通过搜索此表进行检查


    希望这有帮助。

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

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

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

    用户输入促销代码。您可以相应地降低商品的价格,但由于购买尚未完成,因此无法更新“已使用促销”字段。在未完成购买的情况下,用户输入另一种产品的促销代码并再次获得折扣。在多次这样做之后,用户就可以完成购买了。由于在最后一步没有检查代码的有效性,用户可以获得所有的降价

    所以

    • 维护促销代码的有效状态

    • 始终检查有效性

    • 使用原子方式更新有效性状态,使用促销并完成购买。(交易)

      在完成购买前使用促销代码和促销


    选项:使用事务,或者简单地将条件添加到更新中。@jcaron谢谢你的回答,我已经想到了这两个选项,我认为更新中的条件将是一个很好的解决方案,我对SQL不是很在行,你能写下代码的样子吗?我没有想到这一点,我会使用它。谢谢谢谢你的回答,我想你不明白促销代码是怎么工作的。当用户使用促销代码时,它会让他在网站上自由消费,用户在购买物品时不会使用促销代码获得折扣。