2015-04-02 51 views
1

對不起,這個帖子有很多答案,但我旋轉着我的輪子,並沒有想法。很簡單:刪除所有記錄超過1分:PHP MySQL刪除行時間超過1分鐘

function deleteExpiredKeys ($link) { 

    $date = date("Y-m-d H:i:s"); 
    $time = strtotime($date); 
    $time = $time - (60); 
    $date = date("Y-m-d H:i:s", $time); 

    $sql = 'DELETE from Session_Keys 
      WHERE updated_at < ' . $date; 

    $result = mysqli_query($link, $sql); 

    if (!$result) return false; 

    return true; 
} 

'的updated_at' 是一個datetime場。

這不會引發任何錯誤,但它也不會刪除任何內容。我嘗試了許多不同的東西,其中大部分比我在這裏發佈的內容更優雅,但沒有任何效果。誰能幫我?謝謝。

+1

您需要引用日期。 – Sammitch 2015-04-02 23:26:38

+2

另外,爲什麼你在日期強制字符串格式,然後通過'strtotime()'餵食? '$ time = time() - 60;' – Sammitch 2015-04-02 23:27:45

+0

@ Sammitch - 謝謝。引號是問題。我令人費解的$ time變量只是許多不同嘗試的結果,每個嘗試都可能比前一個變得更笨。現在我將它清理乾淨,然後讓它工作。再次感謝! – Alex 2015-04-02 23:39:51

回答

0

當與日期/日期時間進行比較時,MySQL會默認地將格式正確的字符串轉換爲日期。你的代碼不會將字符串作爲字符串,而是將其作爲字符序列(字符串需要用引號分隔)。

試試這個:

function deleteExpiredKeys ($link) { 

$date = date("Y-m-d H:i:s", strtotime('1 minute ago')); 

$sql = 'DELETE from Session_Keys 
     WHERE updated_at < ?'; 

$stmt = mysqli_prepare($link, $sql); 
mysqli_stmt_bind_param($stmt, 's', $date); 
$result = mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); 

if (!$result) return false; 

return true; 

} 

它採用preprared聲明,這是最好的做法。

+0

我永遠不會反對使用準備好的語句;這確實是人們應該習慣做的事情。 - 但是,就這樣說,我還必須說,在這個特殊的情況下,這是沒有必要的。 '$ date'值是一個已知的,靜態定義的格式,不會出現注入威脅。 – Atli 2015-04-02 23:53:08

+0

我同意,當所有數量已知或計算完成時,使用預準備語句幾乎沒有什麼好處(除非您正在使用僅在值不同的SQL語句中執行過多循環)。但是,一直使用它們是一種很好的做法,直到它們成爲性能問題。這將有助於防止您盲目複製某個功能部分的時刻,只有當您允許用戶輸入時(我確信我們都已經完成了這些)。 – T0xicCode 2015-04-03 00:02:42

+0

謝謝,@ T0xicCode。你的$ date變量比我在這裏發佈的要乾淨得多,而且它適用於我。每當我有一個來自外部參數的變量時,我都會使用準備好的語句。在這種情況下,我將堅持使用更簡單的方法。 – Alex 2015-04-03 02:06:14

0

您不需要在PHP中創建時間。 MySQL能夠自行完成時間計算。

DELETE from Session_Keys 
WHERE updated_at < NOW() - INTERVAL 1 MINUTE 
+0

謝謝,@Atli。我曾嘗試過這種嘗試,但由於某種原因,它不適合我。不知道爲什麼它是失敗的... – Alex 2015-04-03 02:04:06

相關問題