检查数据库中的日期字段是否在php中过期

时间:2014-10-04 08:16:49

标签: php mysql date

我有这个令牌表

-------------------------------------------------
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;
        }
    }
}

2 个答案:

答案 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命令尽可能简单。在你的情况下,我认为不需要在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;
}

(未调试!)。大多数时候我需要一行,比如这一行,用于多个事情,所以我将它包装成一个类,读一次并多次使用数据。这大大降低了数据库的负载。