如何检测表中的冗余行?

时间:2016-06-28 20:32:47

标签: php mysql sql security cookies

我关注this answer解决方案#1 。过了一会儿,表格中会有一些冗余的行。假设这个表:

+------+------------------+
| user |     cookie       |
+------+------------------+
| 1    | ojer0f934mf2...  |
| 2    | ko4398f43043...  |
| 2    | 34fjkg3j438t...  |
| 3    | 0243hfd348i4...  |
+------+------------------+

当用户1删除其浏览器的Cookie时,该行仍然存在于数据库中:

| 1    | ojer0f934mf2...  |

当他打开我的网站时,他需要再次登录。所以这是表格:

+------+------------------+
| user |     cookie       |
+------+------------------+
| 1    | ojer0f934mf2...  | -- now this row is useless anymore
| 2    | ko4398f43043...  |
| 2    | 34fjkg3j438t...  |
| 3    | 0243hfd348i4...  |
| 1    | 0243hfd348i4...  |
+------+------------------+

将来肯定会增加这些无用行的数量。那我该怎么办呢?实际上,我可以通过删除冗余行来创建EVENT来清理该表(每天)。但问题是:如何检测它们?如何指定行无用?

编辑:我可以添加新列并存储时间戳,然后按EVENT (或cron作业)删除所有旧时戳行。但这不是一个完美的解决方案。我喜欢cookie一直有效,直到用户退出(所以我不喜欢cookie的任何限制(或过期时间)

现在我正在寻找一种解决方案来确定冗余行(不是旧行)

4 个答案:

答案 0 :(得分:1)

添加带有时间戳的另一列。然后运行常规cron作业以删除时间戳早于某个阈值的任何行(例如,1天)。

您可以输入时间戳并在每次看到该用户时更新它,这意味着他们会退出"退出" x上次使用网站后的时间(但这意味着更多的数据库传输);或者你可以在第一次创建会话时插入一个时间戳,而不再触摸它,这将"将它们记录下来" x上次登录后的时间量(对用户来说不太方便,但这意味着数据库传输较少)。

答案 1 :(得分:0)

创建用于检查cookie表中已存在的用户的代码。

如果用户列中存在用户ID - 只需使用新的cookie信息更新它。如果用户ID不存在,请创建新记录。

或者您可以检查现有记录,删除它们,然后插入新记录。

答案 2 :(得分:0)

在这种情况下,不清楚冗余的含义。没有办法区分这两行:

+------+------------------+
| user |     cookie       |
+------+------------------+
| 1    | ojer0f934mf2...  | -- now this row is useless anymore
| 1    | 0243hfd348i4...  |
+------+------------------+

如果您添加一列以使第一行可识别,那么问题就会解决:在每个insert之前,delete它将取代的行。不需要cron;在最坏的情况下,每个user将在数据库中有一个剩余的行,将在下次使用时删除。

我还建议使用主键来强制执行 no-redundant-rows 规则。

答案 3 :(得分:0)

当用户注销时,显式删除表中与其当前cookie对应的行。

为了安全起见,您应该在cookie中的随机值中存储数据库表中cookie的安全散列(例如SHA-2)。

为了处理不再使用特定浏览器的用户,请为最后使用日期存储另一个字段。一旦检测到用于访问应用程序的行的cookie,就立即更新此日期。

然后,您将需要每隔一段时间运行一次计划任务,以清理最近未使用过的会话。