我有一个用户登录的网络应用程序。 每次特定用户登录时,我都会将登录日期时间存储在MySQL数据库中:
(yyyy-mm-dd hh-mm-ss)
db中的每条记录都有一个user_identifier和last_login_datetime
但是,我想确保用户每天只能登录一次
我正在考虑将PHP中的时间函数与数据库中的日期时间进行比较,看看用户是否已经登录。
如果用户今天登录,我会把他踢出去。
如何将数据库中的记录与PHP中的时间函数进行比较,以查看用户是否已登录?
谢谢!
答案 0 :(得分:1)
您可以在SELECT
的条件中添加类似这样的内容,以便在用户登录时验证用户的凭据
... (AND DAY(last_login_datetime) != DAY(NOW()) OR MONTH(last_login_datetime) != MONTH(NOW()) OR YEAR(last_login_datetime) != YEAR(NOW()))
如果日,月或年与今天的日,月和年不匹配,则选择将返回用户(假设其他凭据/条件有效)。如果没有返回结果,则用户的凭据不正确或用户今天已登录 - 无论哪种方式,都不允许他们根据您的要求登录。
答案 1 :(得分:1)
我知道这不是你要求的,但这可以用严格的SQL来完成
SELECT * FROM table WHERE DATEDIFF(created_on, NOW()) <= -1
这将返回超过1天前登录的所有用户。当然,您可以将其限制为您想要的特定用户,如果结果为空,则拒绝他们登录权限。
答案 2 :(得分:1)
如果您因任何原因需要在PHP中比较日期,最好的方法是使用DateTime,DateTimeZone和DateInterval类。
原因是计算差异很容易,从各种输入日期构建日期对象,最重要的是 - 时区也被考虑在内,这样你在处理夏令时时就不会犯错。
如何:
$date = '2011-07-11 13:37:37';
$timezone = 'Europe/London';
$date = DateTime::createFromFormat('yyyy-mm-dd hh-mm-ss', $date, new DateTimeZone($timezone );
$now = new DateTime(time(), $timezone);
$diff = $date->diff($now); // You got the difference here. If the difference is less than 24h then attempt in the same day occurred.
if($diff->h < 24)
{
// failure
}
答案 3 :(得分:0)
如果你想在PHP中执行此操作,可以使用strtotime()转换为时间戳(自1970年1月1日以来的秒数),然后根据需要进行比较:
$time = strtotime($row['time']);
答案 4 :(得分:0)
除了完全在数据库端完成之外,因为它是可能的(并且可能更容易在SQL和PHP之间进行混乱),使用来自两个不同平台的格式化时间戳时应该做的最好的事情是转换它们将字符串时间戳记为统一时间戳。
您可以使用strtotime()执行此操作。当我需要将SQL服务器时间戳与服务器时间戳进行比较时,我经常遇到这种情况,所以当我需要将它带到PHP端时,我只使用好的ol strtotime()。
答案 5 :(得分:0)
PHP代码段:
$today = date('Y-m-d');
$dbDate = new DateTime('2011-07-11 12:00:00'); // DB Date as parameter
if($today == date_format($dbDate,'Y-m-d'))
{
; // Magic
}