2014-10-04 83 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; 
} 

(不調試!)。大多數情況下,我需要一個行來處理多個事情,所以我會將其包裝到一個類中,讀取一次並多次使用這些數據。這顯着降低了數據庫的負載。