2015-04-02 46 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

相关问题