【问题标题】:How to perform an SQL query x minutes after another one is executed?如何在执行另一个 SQL 查询后 x 分钟执行一个 SQL 查询?
【发布时间】:2015-01-30 12:36:37
【问题描述】:

如何在输入数据 5 分钟后自行更新已放入数据库的信息?

假设我有一张桌子:

   +--+--+-----+
   |id|ip|count|
   +--+--+-----+
   | 1|..|3    |
   +--+--+-----+

当计数大于 1 时,我想等待 5 分钟,然后将其改回 1。

我想要这个,因为我想在用户输入密码错误 3 次或更多次时设置“超时”!

所以我为用户输入错误密码编写了这段代码:

$currentIP = $_SERVER['REMOTE_ADDR'];
$ipcheck = mysqli_query($con,"SELECT *
FROM ipcheck");
while($row = mysqli_fetch_array($ipcheck))
{
    if($currentIP == $row['ip']){
        if($row['count'] > 2){
            //attempted to log in too many times!
            header("Location: secure?err=2");
            exit;
        }else{
            $IPUsed = "YES";
        }
    }
}
if($IPUsed == "YES"){
    //They have failed to log in AGAIN!
    $updateIP = mysqli_query($con,"UPDATE ipcheck 
    SET count = count + 1
    WHERE ip = '".$currentIP."'");
}else{
    //first failed login attempt
    $insertNewIp = mysqli_query($con,"INSERT INTO ipcheck (ip)
    VALUES ('".$currentIP."')");
}

这创建了上面的表格,但是解决我的问题的最佳方法是什么?会通过使用cron吗?或者可能是 MySQL 预定事件?

【问题讨论】:

    标签: php database mysqli


    【解决方案1】:

    不要使用 1 或 0 表示被阻止,而是使用时间戳。当用户尝试登录时,检查当前时间并将其与数据库中的时间戳进行比较

    【讨论】:

      【解决方案2】:

      不要手动重置计数,而是在表中添加一个时间戳列,指示上次尝试的时间。

      当检测到无效尝试时,将当前时间与记录时间进行比较:

    • 如果超过 5 分钟,则重置计数。
    • 如果小于 5 分钟,则在低于阈值时增加计数,如果超过阈值则阻止尝试。
    • 【讨论】:

        猜你喜欢
        • 2017-08-21
        • 1970-01-01
        • 2018-08-12
        • 2017-11-14
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 1970-01-01
        • 2016-01-05
        相关资源
        最近更新 更多