在超时不能在php中工作后,在DB中使密码字段为空

时间:2014-03-13 15:59:23

标签: php sql login countdowntimer

正在开展一个项目,在该项目中,用户有60秒的时间将OTP输入到网站的登录页面。

我在这里创建了一个" Generate"生成OTP的按钮,一旦执行点击事件,定时器将启动,如果时间超过60秒,用户有60秒登录网站,应自动删除存储在数据库中的OTP。

 if(isset($_POST['generate']))
    {
   $timer = time();
        if($timer == $timer+5)
       {
         $query = mysql_query("UPDATE user_login SET password='' WHERE username = 'ajai sandy'") ;
                     $qry_run = mysql_query($query);
       }
       $string = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
       $string_shuffled = str_shuffle($string);
       $password = substr($string_shuffled, 1, 7);
       $password = base64_encode($password);
       $query = mysql_query("UPDATE user_login SET password='".$password."' WHERE username = 'ajai sandy' ");
       $qry_run = mysql_query($query);
       }

问题是60秒后密码未被删除。我在php下尝试了这个

3 个答案:

答案 0 :(得分:0)

这是因为php 像流一样。在这段时间后它不会自行移除 整个解决方案是选择定时器未通过的位置,而不是存在的行。

所以你创建一个列valid_until,当他们尝试登录时,你做

WHERE valid_untill>=".( time()-60 )."

要清理数据库,可以添加一个cronjob来删除旧的

答案 1 :(得分:0)

变量永远不会超过自身:)($variable永远不会等于$variable + something

确保将$timer置于验证之外(if语句)并检查当前时间。

这样的事情:

$originalTime = time();

if (isset($_POST['generate'])) {
    if (time() > $originalTime + 60) {
        // do your stuff
    }
}

编辑:您实际上必须将$originalTime添加到会话变量或Cookie中,并在下一页上检查它。但逻辑是一样的:你必须将原始时间与你在邮寄时检查的时间分开。

答案 2 :(得分:0)

关注@Martijn advice

因为PHP本身并不是一种线程语言,所以你想要实现的是某种方法很棘手。

我会通过在数据库中放置字段来处理这个问题。例如,当您生成。

UPDATE user_login 
SET password='xxxxx', generated='true', created_time='xxxx' 
WHERE username = 'ajai sandy'

然后我会设置一个php脚本在cron作业上每分钟运行一次,以清除密码,其中生成的字段设置为true,创建时间超过60秒