如果其他人打开记录,我如何阻止人们打开记录?

时间:2012-03-08 15:44:44

标签: php mysql html forms

我正在创建一个PHP Web应用程序,其中包括:

1)用户打开记​​录

2)用户对记录进行了更改

3)保存对记录的更改

由于这是一个多用户应用程序,我想防止两个用户同时打开相同记录的情况,并且一个用户的更改会覆盖下一个,最好是在记录为时执行某种锁定方法打开时,当用户离开页面时自动解锁。

4 个答案:

答案 0 :(得分:2)

记录,你的意思是SQL记录?如果是这样,您可以添加另一列isOpen。只要其他人将其打开,就将其设置为1,在这种情况下,请不要将其提供给任何其他人。

在这种情况下,最好还实现一种超时机制,在强制关闭之前,记录只能在'x'分钟打开。

(编辑:这个答案假设您希望在用户查看从表中获取的信息的整个持续时间内锁定记录。如果您只想在读/写操作发生的瞬间锁定记录在那个记录上,MySQL引擎有内置的机制)

回复您的评论

为了让活跃用户离开时让其他人可以访问记录,我可以想到两种方法来实现它:

  • 允许超时机制来处理它。根据您的情况,足够短的时间窗口可以正常工作。
  • 除了超时之外,还要实现心跳机制 - 页面上的Ajax脚本轮询服务器,让它知道页面仍处于打开状态。如果用户导航,服务器会识别跳过的心跳,并取消设置记录。在这种情况下,超时仍然优先。因此,如果用户将窗口打开并离开,服务器仍会收到心跳,但是当时间窗口关闭时,服务器会取消记录(尽管仍然接收到心跳)。

答案 1 :(得分:2)

我使用字段update_date。当用户读取记录时,我会用这个日期写一个cookie。当用户更新记录并提交新数据时,我会添加WHERE update_date = '$my_escaped_date' AND id = '$the_edited_id',如果mysql_affected_rows为零,我会显示编辑数据已过时的错误消息。它并不完美,就好像你编辑旧数据一样,你必须重新输入它,但它能完成这项任务。

答案 2 :(得分:1)

锁定方法正是mysql中可用的方法:

http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html

它不是自动的,但它可以让你锁定一张桌子,做一些东西然后再解锁。

小心这个'如果您忘记解锁桌面或用户需要很长时间才能更改某些内容而系统不会被锁定,而您只能在该用户提交表单时将其解锁。

更好的方法是从表中读取数据并在提交表单后,检查数据是否未被更改。如果有,您可以通知用户更改,其他方面您可以锁定表,执行更改并再次解锁。

答案 3 :(得分:0)

您可以在记录表中添加字段in_use, 当用户打开该记录时,将其值更新为1并保存 将其更新回0。

如果值为1 - 记录被锁定,不会为其他用户打开。