Php 防止多人编辑同一表单

Php 防止多人编辑同一表单,php,forms,laravel,Php,Forms,Laravel,我有一个laravel应用程序,被多个用户同时使用,他们都有可能在我们的系统中编辑一些项目 我不想让两个人同时编辑同一张表格 如果发生这种情况,我想告诉其他用户当前表单已被锁定,并且正在通过用户名进行编辑。 如果用户随后离开或提交表单,则该表单将打开供其他用户使用 我已经检查了乐观锁定和悲观锁定,我认为这对我不正确 我想做的是,在正在编辑的表中创建一个唯一的标识符,如果页面上的用户具有该标识符,我将锁定所有其他标识符,但我如何知道用户是否关闭浏览器窗口?那么所有其他用户仍然无法访问页面/表单 你

我有一个laravel应用程序,被多个用户同时使用,他们都有可能在我们的系统中编辑一些项目

我不想让两个人同时编辑同一张表格

如果发生这种情况,我想告诉其他用户当前表单已被锁定,并且正在通过用户名进行编辑。

如果用户随后离开或提交表单,则该表单将打开供其他用户使用

我已经检查了乐观锁定和悲观锁定,我认为这对我不正确

我想做的是,在正在编辑的表中创建一个唯一的标识符,如果页面上的用户具有该标识符,我将锁定所有其他标识符,但我如何知道用户是否关闭浏览器窗口?那么所有其他用户仍然无法访问页面/表单


你们建议我怎么做?

将一个可为空的
锁定列添加到
项目的
数据库中。然后在
项目
模型中,将此字段添加到
$dates
数组中,以便它可以自动转换为
实例

当有人打开项目进行编辑时,只需将
locked_设置为
字段到未来日期,我认为+5秒可能是一个不错的选择。编辑表单应该每5秒发送一次ajax请求,以便在接下来的5秒钟内保持项目锁定

当用户保存项目更改时,锁定将停止,因为不会发送ajax请求。在这种情况下,您还有一个字段,它可能会告诉您上次打开项目的时间

如果
locked_to
字段等于或大于
new Carbon
实例,用户将无法编辑项目

更新-更多信息


无需清除此字段。若用户并没有完成编辑-他只是重新加载页面,导航到其他页面,关闭窗口或浏览器,等等。。。用于锁定的ajax将不再执行,因此在接下来的5秒钟内,当前编辑的项目将被解锁-
locked\u to
字段将包含比当前日期更早的日期。

将可空的
locked\u to
列添加到
项目数据库中。然后在
项目
模型中,将此字段添加到
$dates
数组中,以便它可以自动转换为
实例

当有人打开项目进行编辑时,只需将
locked_设置为
字段到未来日期,我认为+5秒可能是一个不错的选择。编辑表单应该每5秒发送一次ajax请求,以便在接下来的5秒钟内保持项目锁定

当用户保存项目更改时,锁定将停止,因为不会发送ajax请求。在这种情况下,您还有一个字段,它可能会告诉您上次打开项目的时间

如果
locked_to
字段等于或大于
new Carbon
实例,用户将无法编辑项目

更新-更多信息


无需清除此字段。若用户并没有完成编辑-他只是重新加载页面,导航到其他页面,关闭窗口或浏览器,等等。。。用于锁定的ajax将不再执行,因此在接下来的5秒钟内,当前编辑的项目将被解锁-
locked\u to
字段将包含比当前日期更早的日期。

我将创建一个表来保存与表单表相关的临时数据。当用户输入表单id 1时,我会将用户id、表单id、输入日期和上次修改日期添加到新表中。我会每隔2分钟或其他时间发出一个ajax请求,只是告诉服务器我仍在处理表单,并更新表。如果用户在5分钟内没有发送任何内容,或者在这段时间内没有提交表单,我将从数据库中删除该条目。这样,您就可以在尝试访问表单时验证是否有人正在处理表单。嗨@PhiterFernandes为什么要创建临时数据表?。我不想让任何人一次只编辑一个人,所以我想为第一个用户在访问页面时创建一个视觉编号,如果用户完成编辑并关闭浏览器窗口,我将删除视觉编号。但是我怎么知道用户是否关闭了浏览器窗口呢?Kind Alives/DannieCodeIgniter临时使用ci_会话表来存储会话数据。如果这符合你的目的,那么这样做完全可以。通过这个额外的表,您可以控制多个表单。Oki@PhiterFernandes因此,如果我理解正确,如果临时表中存在具有某些userID和FormID的行,我会将表单锁定给其他用户,您能否举例说明,如果用户关闭浏览器窗口,您将如何删除临时行?如果他关闭浏览器窗口,你不可能知道。你可以做一个例行程序,或者每5分钟运行一次,然后验证其中一条记录是否过期。在最坏的情况下,表单将被锁定9:59分钟,没有任何人使用它。我将创建一个表来保存与表单表相关的临时数据。当用户输入表单id 1时,我会将用户id、表单id、输入日期和上次修改日期添加到新表中。我会每隔2分钟或其他时间发出一个ajax请求,只是告诉服务器我仍在处理表单,并更新表。如果用户在5分钟内没有发送任何内容,或者在这段时间内没有提交表单,我将从数据库中删除该条目。这样,您就可以在尝试访问表单时验证是否有人正在处理表单。嗨@PhiterFernandes为什么要创建临时数据表?。我不想让任何人一次只编辑一个人,所以我想为第一个用户在访问页面时创建一个视觉编号,如果用户完成编辑并关闭浏览器窗口,我将删除视觉编号。但是我怎么知道用户是否关闭了浏览器窗口呢?Kind问候/DannieCodeIgniter使用一个ci_会话表,它是