Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止两个用户同时编辑同一内容_Php_Jquery_Codeigniter - Fatal编程技术网

Php 如何防止两个用户同时编辑同一内容

Php 如何防止两个用户同时编辑同一内容,php,jquery,codeigniter,Php,Jquery,Codeigniter,我制作了一个多用户应用程序,其中如果两个用户打开同一个编辑页面,同时两个用户都以表单形式输入数据,则会出现冲突数据,因此我需要一个解决方案,例如如果一个用户打开特定的编辑页面,那么所有其他用户会阻塞一段时间,并向他们提示一条消息,如“其他用户编辑同一页面…”可能, 您可以在数据库中添加两列“打开”和“时间” 如果有人正在编辑“open”,请将其设置为“true”或“false”。 还要为“时间”列设置时间戳。在进行编辑时,每隔这么多秒更换一次时间戳 如果其他人打开了它,请检查“打开”列,如果该列

我制作了一个多用户应用程序,其中如果两个用户打开同一个编辑页面,同时两个用户都以表单形式输入数据,则会出现冲突数据,因此我需要一个解决方案,例如如果一个用户打开特定的编辑页面,那么所有其他用户会阻塞一段时间,并向他们提示一条消息,如“其他用户编辑同一页面…”

可能,

您可以在数据库中添加两列“打开”和“时间”

如果有人正在编辑“open”,请将其设置为“true”或“false”。 还要为“时间”列设置时间戳。在进行编辑时,每隔这么多秒更换一次时间戳

如果其他人打开了它,请检查“打开”列,如果该列为“真”,请计算从“时间”列经过的时间。 如果超过一定时间(比如2或3分钟),则假定其他用户不再编辑,并允许该用户编辑

说清楚了,

备选案文1:

  • 用户单击“编辑”
  • 检查“打开”列,如果为“false”,则将其设置为“true”,并将时间戳添加到“time”
  • 只要用户在inputfield中输入,大约每10秒就会发出一个AJAX调用,用当前时间戳更新“time”列
  • 用户单击“保存”,“打开”列设置为“假”。 -
备选案文2:

  • 用户单击“编辑”
  • 检查“打开”列,如果为“真”,则检查“时间”列
  • 如果与当前时间戳的差异超过(比如)2-3分钟,则允许为此用户进行编辑并更新时间戳

    • 给内容一个修改时间。在提交新内容之前,请检查时间是否与以前相同。如果不同,则内容已更改,应通知用户


      解决大多数边缘问题。

      最好也是最简单的方法是在编辑用户单击“编辑”后,在网站和编辑用户之间保持实时连接

      因此,基本步骤如下:

      1) 用户单击编辑。
      2) 启动与该用户的ajax或websocket连接,告知服务器该文件仍在编辑中
      3) 如果用户手动关闭或刚离开网站,请在服务器端处理该问题
      4) 利润


      对服务器的连续ajax调用(如聊天应用程序)可以更新“上次编辑的时间”列,如果该列的时间超过10秒,则可以安全地编辑该文件,否则表示仍有人在编辑该文件。

      在表中有一个字段,如页面状态,并在用户打开进行编辑时将其设置为锁定。如果编辑完成,则将其设置为“解锁”。并且每次在允许每个用户编辑之前检查状态


      如果用户关闭页面而不进行编辑。然后为每个用户设置会话并设置时间限制,如果会话过期,则将状态设置为unlocked。

      为此,您必须在表中保留标志,如果您的表名为“userdetails”,其中包含名称、手机、电子邮件、地址等列,那么现在您可以再添加两个列名

      与默认值为0的数据类型TINYINT一起使用 数据类型为datetime且默认值为NULL的inuseddatetime

      因此,一旦特定用户打开详细信息进行编辑 将使用的列更新为1 以及包含该currendt日期和时间的inuseddatetime列

      因此,其他用户打开相同的详细信息进行编辑,如果列的值为1,则显示提示

      为了再次将1更改为0, 当第一个用户再次单击“提交”按钮时,更新 使用的列为0 和inuseddatetime列设置为null


      在某些情况下,如果用户不按提交按钮并离开页面,为了避免这种情况,您可以在服务器上编写cron作业,该作业将检查inuseddatetime列,并将inused列更新为0,以便从最后10分钟或5分钟开始编辑最理想的列(文件?),或者页面本身的内容?例如:如果用户单击“编辑”一列,如
      page\u edit
      应得到1而不是0。当用户完成编辑时,将1 abck返回到零。编辑页面时,将该页面的数据存储在变量中。当您要保存时,如果数据已经更改,只需查询数据库即可。如果是这样,它应该会显示一个警告,如:此页面已被其他人编辑。问题是,如果您打开一个文件进行编辑,并离开计算机5分钟,该文件仍然为您打开,我也可以打开它,导致两个人编辑同一个文件,这取决于您对用户的关心程度。保持不变的是您的系统完整性。如果我希望防止用户浪费时间编辑已在其他地方打开的文件,这也是一点用户体验:)您可以在以后使用差异工具,允许用户合并其更改。这里有一些PHP实现,假设这是您首先想要的。不完全是OP要求的。当然,你可以运行一个类似git的版本跟踪器,但这并不能解决OP问题。@JaMaBing用你的编辑更新了我的答案,你仍然强迫一些任意的时间过去。假设我打开编辑,我正在写一个很长的字符串,5分钟过去了,我还在输入,为什么文件要改为“closed”?@Patrick它会每隔10秒左右通过一个AJAX调用用当前时间戳更新“time”列,而文本框中有动作。AJAX是这个问题的真正答案(或WebSocket),但你没有在回答中说明。至少在我看来。这基本上是我发布的答案,我会删除选项2,它不是一个真正的选项。但是ajax/websocket方式是goSo的唯一方式。你还需要跟踪哪个用户编辑了文件,这样你就可以检查特定用户的会话是否过期,你也被迫这样做将会话存储在数据库中以检查是否过期。