正在开展一个项目,在该项目中,用户有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下尝试了这个
答案 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秒