如何设置访问页面的最大用户数

时间:2018-10-12 10:00:35

标签: php html max

我目前正在使用带有“编辑”按钮的应用程序:

我的编辑按钮:

<th title="Edit task" class="edit" style="float: right; $color;">
    <?php
    echo "<a href=edit.php?id=" . $row["id"] . ">
              <i class=material-icons>edit</i>
          </a>";
    ?>      
</th>

我的目标是一次只能编辑一个人。这有可能吗?如果是我该怎么办?

9 个答案:

答案 0 :(得分:2)

如果只想禁用按钮以避免并发编辑,那么这是一个糟糕的主意,因为用户始终可以通过直接链接打开编辑页面。实际上,您需要实现并发控制。

您可以实现将记录锁定到并发控制。

例如,您可以使用以下简单算法来实现并发控制:

  1. 您添加的参数将包含文章锁定的结束时间
  2. 在编辑页面上:如果锁定时间大于当前时间,则将此时间与当前时间进行比较,然后通知用户有关文章无法修改的信息,否则向用户显示编辑页面
  3. 在编辑页面上:如果向用户显示文章的编辑页面,则增加锁定参数的结束时间,例如以5分钟为增量
  4. 如果用户完成记录修改并保存,则您应该重置锁定的结束日期

但是可以使用乐观锁定来代替此算法。

乐观锁定使用户可以同时打开一个编辑页面,但是它禁止以并行方式保存记录。这是避免并行修改记录的麻烦的更好方法

乐观锁定在于接受或拒绝记录,取决于记录版本。

它的工作原理如下:每篇文章都有一个“版本”参数,其中包含记录修改的数量。一位用户打开版本等于1的文章的编辑页面,另一位用户同时打开它。他们两个都保存同一篇文章。最初,您会收到一个记录修改请求,并将存储记录的版本与更新记录的版本进行比较(如果它们彼此相等),那么您应该接受更改并将更新的记录保存在存储中,并以的增量增加“版本”参数1否则,您应该拒绝更改。这种算法的结果是,存储的记录的版本将等于2。接下来,您将获得第二个请求并再次比较版本,但是由于存储的记录的版本等于2,并且来自第二个请求的更新记录的版本等于1,因此更改被拒绝。当然,您必须通知用户有关其更改的拒绝,并使用户能够更新记录的新变体

答案 1 :(得分:1)

根据我的理解,解决您的问题非常简单。

  • 首先,创建一个或多个表,在其中记录用户以自己的方式进行的更新查询
  • 制作一个脚本,该脚本将执行您在第一步中执行的表的最早查询,然后在成功运行更新后成功删除该查询
  • 学习Cron Jobs
  • 在特定时间间隔内为该脚本创建一个cron job

享受生活吧:)

答案 2 :(得分:1)

这是我在应用程序中所做的:

当用户按下编辑按钮时,将时间戳记记录在数据库中并将用户重定向到编辑页面。在编辑页面中设置一个计时器,并将其显示给可以编辑记录的用户,直到计时器用尽。

例如,基于您的记录,您可以考虑2分钟以供用户编辑记录。时间将从01':59''开始,一直到00':00''。

对于其他用户,当单击“编辑”按钮时,您应该检查其他用户是否正在编辑该记录,并且可以通过从登录数据库以及现在的时间计算时间来做到这一点。

如果用户在2分钟内编辑记录并将其保存,则可以删除编辑日志以允许其他用户进行编辑。

答案 3 :(得分:0)

根据我的观点,这是不可能的。

但是尝试用下面的方法做。

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

如果有人正在编辑,则将“ open”设置为“ true”或“ false”。还要在“时间”列中设置时间戳。编辑时,每隔几秒钟就要更换一次时间戳。

如果其他人将其打开,请检查“打开”列,并选择“真”,然后从“时间”列中计算经过的时间。如果超过一定时间(例如2或3分钟),请假定其他用户不再编辑,并允许该用户进行编辑。

为了弄清楚,

您需要添加一个ajax调用,这将在每分钟/秒后更新您的时间戳。 如果您在编辑页面中。 因此,如果有人关闭浏览器,则时间戳将不会更新,并且在尝试下一个用户进行编辑之后,如果时间戳较旧,则为2/3分钟,然后允许编辑该用户。因为我们假设用户关闭了选项卡或浏览器,所以标记未更新,但时间戳记较旧。

这不是完美的解决方案,但是您可以尝试。

答案 4 :(得分:0)

有简单的方法和困难的方法。

简便:使用时间戳检查保存时的并发性。

您只需在数据库中添加一个时间戳(通常称为update_at)以及数据即可。

您将时间戳记放置在页面中(或将$ _SESSION变量设置为更安全),以便在发布更改时也发布时间戳记。在服务器端,您要验证数据库中的时间戳是否与您发布的时间戳相同,如果不是,则返回一条消息,指出该帖子已被编辑。

如果您关心用户在键入什么内容(大多数情况下应该这样做),则始终可以同时显示两个编辑内容,并允许他选择/编辑其中一个。

硬方式:将锁定时间戳记存储在数据库中

您可以使用简单的方法为数据添加时间戳(但这次我们将其称为last_edit_time)。

当用户进入编辑页面时,您可以执行以下操作:

  • 您检查last_edit_time是否与当前时间相距30秒
    • 如果少于30秒,您会返回一条消息,提示您正在修改数据
    • 如果时间超过30秒,则将last_edit_time的值设置为当前时间,并显示您的编辑页面
  • 用户进入编辑页面后,您将启动15秒的JavaScript间隔
    • 每隔15秒,您会向服务器发送一个异步请求(Ajax),告诉服务器将last_edit_time更新为当前时间。我们每15秒钟发送一次,这样,如果临时呼叫花费很长时间,则要在30秒后立即进行编辑的用户将不会加载该页面。

这样做可以确保只有一个用户可以同时访问该页面。如果要使其更加安全,可以在last_edit_time旁边添加用户ID,以便在保存时验证是否是同一用户。

用户完成编辑后,甚至可以将last_edit_time设置为null。这样将尽快为所有人解锁数据。

当然,在某些情况下,两个用户会在同一秒内打开页面。要解决此问题,您始终可以提高时间戳的精度(毫秒而不是秒)。

答案 5 :(得分:0)

您可以轻松完成此操作,请按照以下步骤操作。

1)在列所在的位置创建一个表名称作为editLog id,member_id / user_id,is_editable(默认为1)

2)现在,初始表中的表为空,同时单击数据库中的任何数据时,第一个用户来编辑Fire AJAX,同时检查表中是否没有数据,然后允许他进行更改(和当您保存或更新表中的数据时,还要检查成员ID,以确保成员相同),如果数据退出,则给他警告错误。

如果您仍有疑问,请按照以下步骤操作。

答案 6 :(得分:0)

从中获取$ row [“ id”]的表将在其中添加一列,并将该列命名为ipAddress,默认值为null。

现在,当用户转到“ /edit.php?id=$id”时,使用用户ip更新表的ipAddress列。您可以通过JS或服务器变量轻松获取用户ip地址。

之后,在edit.php中,您可以轻松地检查当前ip是否等于ipAddress,例如:

    if($_SERVER['REMOTE_ADDR'] == $ipAddress){
      // Allow edit
    }
    else {
      // Donot allow edit
    }

编辑完成或关闭浏览器后,可以将ipAddress设置为null。

答案 7 :(得分:-1)

我做了一些研究,发现很难做到这一点...您可以做的是检查文章是否有最新更新(与对SO的待处理编辑相同)< / p>

答案 8 :(得分:-1)

您可以存储编辑文章的当前用户会话。

存储格式:| article_id | user_session_id |

  1. 用户单击一个按钮:编辑文章(id#5)。

  2. 服务器检查存储空间:是否存在带有article_id =#5

    的记录

    2.1如果没有记录->创建新记录,则在其中存储用户的会话ID。

    2.2如果找到记录->将用户重定向到页面“有人正在编辑文章。请稍后再试”

  3. 用户单击“保存”按钮后-从存储中删除一条记录。

您还可以添加“ time_to_edit”检查。 存储格式:| article_id | user_session_id | time_to_edit |

检查步骤2的'time_to_edit'值。如果用户编辑文章的时间过长,请使用新用户的会话ID重写其会话ID。如果“旧”用户将尝试保存文章-在“会话已过期”页面上重定向。

存储可以是您喜欢的任何东西:memcached,mysql表等。

您还可以检查存储,而无需通过Ajax调用重新加载页面。