【问题标题】:Limiting number of clicks on a button [closed]限制按钮的点击次数[关闭]
【发布时间】:2017-03-24 07:24:08
【问题描述】:

我的网页上有两个按钮(接受和拒绝)。我想限制点击接受按钮的次数。我希望在 24 小时内可以点击接受按钮的次数为 20 次。 24 小时结束后,用户可以再次单击该按钮 20 次。我正在使用 MySQL 数据库和 PHP。

【问题讨论】:

  • 到目前为止你做了什么?有代码吗?请看:stackoverflow.com/help/asking
  • 使用 counder 机制和 settimeout 来实现这一点。
  • 接受按钮是什么意思。
  • 这是一个类似火种的约会网站。用户可以接受或拒绝某人的位置。我还没有开始编写代码,因为我无法开始使用它。

标签: javascript php jquery html mysql


【解决方案1】:

基本上我对 PHP 没有任何想法,但我可以建议实现您的结果可能需要的方式。

您需要一个包含以下特定列的表格。

  1. UserId int PK
  2. FirstClickDateTime 日期时间
  3. 总点击次数

创建一个存储过程,根据以下条件执行插入、更新等操作。

    CREATE PROCEDURE sp_ManageButtonClickByUserId
      @UserId INT,
      @IsClick BIT = 0
    AS BEGIN

-- Lets consider your table name is ManageButtonCLick with columns including 
-- 1.UserId int
-- 2.FirstClickDateTime DateTime
-- 3.TotalClicks int

IF ISNULL(@IsClick,0) <> 0 -- Determine IsClick is true when pass from code
BEGIN
    Declare @TotalClick AS INT
    SET @TotalClick = (SELECT TotalClick FROM ManageButtonCLick WHERE UserID = @UserId);
    SET @TotalClick = ISNULL(@TotalClick, 0) + 1;


    If EXISTS(SELECT 1 FROM ManageButtonCLick WHERE UserID = @UserId) -- If user exists than update record
    BEGIN

        /* Determine the 24 is completed or not for specific user */
        Declare @IsHoursCompleted AS BIT = 0; -- Indecates false
        Declare @TotalHoursCompleted AS INT = 0;

        SET @TotalHoursCompleted = (SELECT DATEDIFF(HOUR, FirstClickDateTime, GETDATE()) FROM ManageButtonCLick WHERE UserID = @UserId);
        SET @IsHoursCompleted = (SELECT CASE WHEN ISNULL(@TotalHoursCompleted,0) >= 24 THEN 1 ELSE 0 END);

        IF (ISNULL(@IsHoursCompleted,0) <> 0)
        BEGIN
            UPDATE ManageButtonCLick
            SET FirstClickDateTime = GETDATE(), TotalClicks = 1
            WHERE UserID = @UserId
        END
        ELSE
        BEGIN
            UPDATE ManageButtonCLick
            SET TotalClicks = @TotalClick
            WHERE UserID = @UserId
        END
    END
    ELSE -- if user not exists than insert that user detail for button click
    BEGIN
        INSERT INTO ManageButtonCLick (UserId, FirstClickDateTime, TotalClicks)
        VALUES (@UserId, GETDATE(), @TotalClick)
    END
END
END 

现在是管理来自代码背后的点击次数

当用户加载此页面时(此时有接受按钮,您需要确定用户在 24 小时内完成了总点击次数。对于此任务,您必须创建一个返回 true 或 false 的函数)。

如果按钮对特定用户启用而不是执行以下操作...

当用户点击“接受”按钮时,您需要从您的代码中调用该过程以及所需的参数。

其他按钮对此用户禁用。

【讨论】:

    【解决方案2】:
    • onclick EventListener 添加到button
    • 将全局变量设置为计数器。
    • 对于每次点击,增加计数。
    • 当它达到 20 时,添加一个 setTimeout 将计数器重置为 0,时间跨度为 86400000(24 小时,以毫秒为单位)。

    检查下面的代码。 (点击20次)

    var times=0;
    function checkTime(btn){
      if(times<20){
         ++times;
      }
      else{
        btn.disabled=true;
        console.log("come back tomorrow");
        setTimeout(function(){ times=0; }, 86400000);
      }
    }
    &lt;button onclick="checkTime(this);"&gt;Accept&lt;/button&gt;

    【讨论】:

      【解决方案3】:

      您不能像@SagarV 建议的那样做,因为这样用户就可以重新加载页面并继续向按钮发送垃圾邮件。您需要在 sessionStorage 或 cookie 中设置标志或其他内容,以防止用户在 24 小时内点击按钮。

      【讨论】:

      • 你能给我一些代码吗?这真的很有帮助。
      • 我不确定您的应用程序是如何工作的,但是使用上面建议的计数器,当达到限制时,然后为该用户设置一个 cookie,如 document.cookie = "username=Bill Bull; expires = 2017 年 3 月 25 日星期六 12:00:00 UTC;路径=/";
      • 或者在窗口对象上使用 sessionStorage,问题是如果用户打开一个新标签,那么它就是一个新会话。
      • 但是有了cookie,如果用户没有cookie或者已经过期,用户可以再次点击按钮,否则不能。
      猜你喜欢
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      相关资源
      最近更新 更多