2014-10-04 70 views
0

已过期,我的这个符号表检查数据库日期字段PHP

------------------------------------------------- 
user_id | time   | token 
------------------------------------------------- 
user1  | 2014-10-01  | hsgdhsdgjsggs34hgxsd 
user2  | 2014-09-18  | sghsgsdgsj454gfhdfg4 
user3  | 2014-12-25  | dfhjdfhjdgee7722dhdd 

时间字段是用PHP函数时(填充),并表示插入时间/日期;

因此,在我的应用程序中,我要检查令牌字段是否有效,它会在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

没有必要检查SQL中的时间。您清楚地知道您感兴趣的是哪一行,因此只需获取整行并在PHP中对该数据进行任何处理即可。 – 2014-10-04 08:32:56

回答

0

我会使用INTERVAL 6 MONTH,但你还需要DAY_ADD()函数,查询会是这样(没有测试过,有可能是一个在有误差):

SELECT time FROM Token WHERE token = ? AND DAY_ADD(time, INTERVAL 6 MONTH) > NOW() 
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; 
} 

(不调试!)。大多数情况下,我需要一个行来处理多个事情,所以我会将其包装到一个类中,读取一次并多次使用这些数据。这显着降低了数据库的负载。