我有这个令牌表
-------------------------------------------------
user_id | time | token
-------------------------------------------------
user1 | 2014-10-01 | hsgdhsdgjsggs34hgxsd
user2 | 2014-09-18 | sghsgsdgsj454gfhdfg4
user3 | 2014-12-25 | dfhjdfhjdgee7722dhdd
时间字段填充了php function time()并表示插入时间/日期;
因此,在我的应用程序中,我要检查令牌字段是否有效,它会在6个月后过期。怎么检查?
我已经使用过这种方法
function checkToken($token, PDO $pdo) {
if ($stmt = $pdo->prepare("SELECT time FROM Token WHERE token = ? AND time + INTERVAL 180 DAY > NOW()")) {
$stmt->execute(array($token));
if ($stmt->rowCount() > 0) {
return true;
} else {
return false;
}
}
}
答案 0 :(得分:0)
我使用INTERVAL 6 MONTH
但你也需要DAY_ADD()函数,查询会是这样的(没有测试过,可能会有错误):
SELECT time FROM Token WHERE token = ? AND DAY_ADD(time, INTERVAL 6 MONTH) > NOW()
答案 1 :(得分:0)
我个人倾向于保持SQL命令尽可能简单。在你的情况下,我认为不需要在SQL中执行日期检查,我只需要获取行并在PHP中执行日期检查,如下所示:
function hasTokenExpired(PDO $pdo,$token)
{
// set the days till the token expires
$daysTillExpire = 180;
// get the row with the token
if ($stmt = $pdo->prepare('SELECT * FROM Token WHERE token = ?'))
{
$stmt->execute(array($token));
$row = $stmt->fetch(FETCH_ASSOC);
// if we got the row see it the token has expired
if (isset($row)) return ($row['time'] < time()-$daysTillExpire*24*60*60);
}
return FALSE;
}
(未调试!)。大多数时候我需要一行,比如这一行,用于多个事情,所以我将它包装成一个类,读一次并多次使用数据。这大大降低了数据库的负载。