【问题标题】:Change the value of a specific field in a record after a bit of time of inactivity in mysql database在mysql数据库中一段时间​​不活动后更改记录中特定字段的值
【发布时间】:2014-10-03 16:08:42
【问题描述】:

我已经使用 Unity3D 为 android 制作了一个应用程序,它每 30 秒在“在线”字段的记录中发送数字 1,其中名称 = 应用程序的玩家名称,在 mysql 数据库中,这要归功于 php 脚本。

所以在我的数据库表中,我有两列:名称和在线。 当用户使用应用程序时,值 1 将根据当前名称发送到数据库表的在线字段下和正确的位置。

如果用户使用相应按钮关闭应用程序,则在线字段设置为 0。 但是如果用户手动关闭我的应用程序,我无法将在线设置为 0。那么,如何设置(在 php 代码中?以及如何?)超过 30 秒后没有在特定在线字段中进行更新,在线设置为 0?

感谢那些可以帮助我的人!太重要了!

【问题讨论】:

  • 你能分享你的尝试吗?
  • 您可以尝试将验证活动的方式更改为可能,存储它们何时到期的时间戳(例如现在 + 10 分钟),并且每次他们在应用程序中执行某项操作时将该字段更新为之前(现在 + 10 分钟)。您需要做的就是检查该时间戳是否已过期 = 不再有效。
  • 谢谢mr12086!你给了我一个好主意!!!
  • 相关(非重复)问题:stackoverflow.com/q/19477036/2359271

标签: php android mysql sql unity3d


【解决方案1】:

听起来您想要做的就是跟踪哪些用户是活跃的,哪些用户是不活跃的。如果是这样,那么您将采取不必要的困难方式。

与其通过发送 1 和 0 来打开或关闭 online,不如在数据库中拥有一个在用户与应用程序交互时更新的 timestamp 字段会更好。这是一个使用单独表的示例(因为我看不到您的架构):

CREATE TABLE user_activity (
  user_id INT UNSIGNED,
  last_active TIMESTAMP,
  PRIMARY KEY (user_id)
);

每当您的用户与您的数据库交互时,发出如下查询:

INSERT INTO user_activity (user_id, last_active)
  VALUES (?, NOW())
  ON DUPLICATE KEY UPDATE last_active = NOW();

? 符号是 user_id 参数的占位符,您可以从 MySQL Improved ExtensionPHP Data Objects interface for MySQL 将其提供给适当的函数,具体取决于您决定在 PHP 代码中使用哪一个.

然后要确定某人是否在线,您会发出这样的查询:

SELECT last_active FROM user_activity WHERE user_id = ?;

并使用返回的时间戳做出决定。

请注意,这种方法也可以以不同的方式实现;您可以决定在数据库中存储一个偏移量时间戳,以表示用户被视为在线的最后时间。就个人而言,我不希望像这样在我的数据库中存储 派生数据。我总是可以在数据库之外派生它,但是如果我改变我的应用程序的工作方式或对不同的用户有不同的会话超时策略,我可能无法恢复关于用户的有意义的信息(他们最后一次活动的确切时间)来自这个派生的“到期日期”字段。

您也不必将此信息存储在单独的表中;将其存储在包含一般用户数据的表中可能更合适。但是,如果您确实将其存储在单独的表中,则应将user_activity.user_id 定义为用户数据表的外键。

【讨论】:

  • 完整准确的回复。非常感谢您的帮助!
  • 请注意,我稍微更改了示例,以使用更合适的 PK 和 INSERT INTO ... ON DUPLICATE KEY UPDATE。如果这是一个更大的用户数据表的一部分,并且该行已经存在,那么您将使用原始的 UPDATE 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
相关资源
最近更新 更多