Php 如何从数据库中删除过期数据(取决于句点列)

Php 如何从数据库中删除过期数据(取决于句点列),php,mysql,sql,date,Php,Mysql,Sql,Date,我想删除过期的数据 我有两列: created\u time:包含一个值,用于指示time()函数(例如:1395836716) period:包含的时间段将保留在数据库中的行(例如:每天3或7或15或30) 我想创建一个查询来检查表中的所有行,以了解过期的行。 问题是我不知道怎么做,但我试过了 $twentyFour = 60 * 60 * 24; mysql_query("DELETE FROM content WHERE created_time + (period * $twentyFo

我想删除过期的数据

我有两列:
created\u time
:包含一个值,用于指示
time()
函数
(例如:1395836716)

period
:包含的时间段将保留在数据库中的行
(例如:每天3或7或15或30)

我想创建一个查询来检查表中的所有行,以了解过期的行。
问题是我不知道怎么做,但我试过了

$twentyFour = 60 * 60 * 24;
mysql_query("DELETE FROM content WHERE created_time + (period * $twentyFour ) > '" . time() . "' ");
但不幸的是,它并没有像我预期的那样起作用


编辑:

这是行的结果


编辑2

通过使用php条件,我做到了:

$twentyFour = 60 * 60 * 24;
$query = mysql_query("SELECT * FROM content");
while ($data = mysql_fetch_assoc($query)) {
    if ($data['created_time'] + ($data['period'] * $twentyFour) < time()) {
        mysql_query("DELETE FROM content WHERE id = $data[id]");
    }
}
$twentyFour=60*60*24;
$query=mysql_query(“从内容中选择*);
while($data=mysql\u fetch\u assoc($query)){
如果($data['created_time']+($data['period']*$twentyFour)
前面的代码工作正常,正如我所希望的。
问题是前面的代码会导致更多服务器负载。
我希望查询能够像前面的代码一样执行,而不使用条件

从内容中删除
DELETE FROM content 
WHERE created_time < DATE_ADD(NOW(), INTERVAL `period` DAY)
创建时间
参见问题的第2版:

鉴于时间以unix时间戳的形式保存,这是必需的:

 DELETE FROM content 
 WHERE (created_time + period * 60 * 60 * 24) <= NOW()
如果使用“real”DateTime列,那么这就是方法:

使用:

日期和日期差异总是很难纠正。问题是您需要选择一个参考点:

1) NOW() against created_at + interval, 
2) NOW() against  `expiry_date
3) created_at + interval against NOW()
4) expiry_date against NOW().
当你尝试解决这个问题时,你倾向于切换参考点,这是非常不直观的

我创建了一个SQL FIDLE来演示所有的计算。“创建时间”日期始终为午夜,以“简化”检查。您可以更改名为“is_now”的变量,并查看所有日期差异的结果和布尔结果。也许这很“有趣”

TL;DR


给出了正确的答案。

我可以建议您编辑数据结构并添加一个新的列
删除\u time

delete\u time
应包含从给定
期间计算的列删除时间的UNIX时间戳


假设您的
期间的POST数据
是数字值,表示要保存数据的天数,
delete\u time
应通过以下公式计算:

$delete_time = time() + $_POST['period']*24*60*60;
这样,您的修剪/删除查询就可以是一行:

mysql_query("DELETE FROM content WHERE delete_time < ".time());
mysql\u查询(“从内容中删除,其中删除时间<”.time());

该查询将删除其
delete\u time
已超过当前
time()

的所有行
period
的值如何
period
决定了行在数据库中的保留时间。我需要您准确地解释它所起的作用,因为我不太确定它将如何影响您在这里所做的工作。基本上,我不知道“在数据库中保留行的周期”是什么意思。例如:我想添加新广告,有一个下拉菜单来确定显示广告的周期(3天、7天、15天、30天)。例如,我将从下拉菜单中选择7天,然后单击“插入”按钮将数据存储在数据库中。
created\u time
列将使用time()函数存储现在的时间,
period
列也将存储下拉菜单的值,在这种情况下将存储7,因为我选择了7天。就这样。我希望您能理解我的意思。不幸的是,它仍然没有删除正确的数据。它是否删除了任何数据?你知道如何建立一个网络吗?如果你能设置一个,那会很有帮助。从创建的内容中删除_time+(period*$twentyFour)created_time
value是UNIXTIME,如下所示
1395912075
->返回的
time()
函数的值。另外,
created\u time
列的类型是
INT
而不是
datetime
@Lion King,谢谢你的提示。让我看到了如何整理我的sqlfiddle。感谢您继续帮助我,请在我的问题(
Edit 2
)中查看我的更新。我认为这是个不错的主意。谢谢您,如果我没有找到其他解决方案,我将使用它,我将给出您的答案作为最佳答案。
1) NOW() against created_at + interval, 
2) NOW() against  `expiry_date
3) created_at + interval against NOW()
4) expiry_date against NOW().
$delete_time = time() + $_POST['period']*24*60*60;
mysql_query("DELETE FROM content WHERE delete_time < ".time());