【发布时间】:2010-11-23 21:00:05
【问题描述】:
我有一个 mysql 数据库,或者更具体地说,我有一个存储 IP 地址的 mysql 表。
这是因为我限制了从我的网站发送的消息数量。 我只是检查IP是否在表中,如果是,我告诉用户“慢下来”。
有什么办法可以让这个 MySql 表只存储一行(一条记录)x 分钟?
其他解决方案也值得赞赏...
【问题讨论】:
标签: php javascript sql mysql database
我有一个 mysql 数据库,或者更具体地说,我有一个存储 IP 地址的 mysql 表。
这是因为我限制了从我的网站发送的消息数量。 我只是检查IP是否在表中,如果是,我告诉用户“慢下来”。
有什么办法可以让这个 MySql 表只存储一行(一条记录)x 分钟?
其他解决方案也值得赞赏...
【问题讨论】:
标签: php javascript sql mysql database
不,但您可以使用 TIMESTAMP 字段来存储插入/修改行的时间,偶尔删除超过 x 分钟的行。
DELETE FROM your_table
WHERE your_timestamp < NOW() - interval 5 minute
不过,为了解决您的实际问题,我建议为每个用户创建一个表格,其中包含一行以及他们最后一次发送消息的时间。假设它被正确索引并且您的查询是有效的,您可能永远不需要从该表中删除任何行,除非您使用用户表的外键并删除相应的用户。当用户发送消息时,如果该行已经存在,则插入一行,否则更新现有行(如果您愿意,可以使用 MySQL 扩展 REPLACE)。
【讨论】:
SELECT NOW() - interval 3 hour,您应该会得到 3 小时前的时间。
hours 而不是hour。单位必须在 MySQL 中是单数形式。如果仍然无法正常工作,请发布您尝试过的确切查询以及错误消息。
我建议您在 SELECT 中添加一个关于时间的 WHERE 子句“只需检查 IP 是否在表中”
SELECT * FROM table WHERE ip = <whatever> and timestamp > NOW() - 3*60
然后可能每晚清空那张桌子一次。
【讨论】:
我会创建一个包含最后发送消息的时间戳的列,另一个包含帖子总数的列。在更新表格之前,请检查自上次发布以来是否至少过去了 X 分钟。如果是,则将帖子总数更改为 1,否则将值增加 1。
【讨论】:
一种不涉及在特定时间间隔后删除 IP 地址的方法是将地址存储为“临时”数据,即仅在特定时间段内有效的记录。
最简单的方法是在表中添加一个时间戳列,并在输入 IP 时捕获它被输入到表中的时间,或者它不再被“限制”之后的时间。
获取要限制的 IP 的代码然后检查时间戳以查看它是否是:
取决于您选择要表示的时间戳。
【讨论】:
这里使用时间戳和 cron 作业的其他解决方案可能是您最好的选择,但如果您坚持让 mysql 自己处理,您可以使用Events。它们就像 cron 作业,除了 mysql 自己处理调度。不过它需要 5.1+。
【讨论】: