我目前正在使用带有“编辑”按钮的应用程序:
我的编辑按钮:
<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>
我的目标是一次只能编辑一个人。这有可能吗?如果是我该怎么办?
答案 0 :(得分:2)
如果只想禁用按钮以避免并发编辑,那么这是一个糟糕的主意,因为用户始终可以通过直接链接打开编辑页面。实际上,您需要实现并发控制。
您可以实现将记录锁定到并发控制。
例如,您可以使用以下简单算法来实现并发控制:
但是可以使用乐观锁定来代替此算法。
乐观锁定使用户可以同时打开一个编辑页面,但是它禁止以并行方式保存记录。这是避免并行修改记录的麻烦的更好方法
乐观锁定在于接受或拒绝记录,取决于记录版本。
它的工作原理如下:每篇文章都有一个“版本”参数,其中包含记录修改的数量。一位用户打开版本等于1的文章的编辑页面,另一位用户同时打开它。他们两个都保存同一篇文章。最初,您会收到一个记录修改请求,并将存储记录的版本与更新记录的版本进行比较(如果它们彼此相等),那么您应该接受更改并将更新的记录保存在存储中,并以的增量增加“版本”参数1否则,您应该拒绝更改。这种算法的结果是,存储的记录的版本将等于2。接下来,您将获得第二个请求并再次比较版本,但是由于存储的记录的版本等于2,并且来自第二个请求的更新记录的版本等于1,因此更改被拒绝。当然,您必须通知用户有关其更改的拒绝,并使用户能够更新记录的新变体
答案 1 :(得分:1)
根据我的理解,解决您的问题非常简单。
享受生活吧:)
答案 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旁边添加用户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 |
用户单击一个按钮:编辑文章(id#5)。
服务器检查存储空间:是否存在带有article_id =#5
的记录2.1如果没有记录->创建新记录,则在其中存储用户的会话ID。
2.2如果找到记录->将用户重定向到页面“有人正在编辑文章。请稍后再试”
用户单击“保存”按钮后-从存储中删除一条记录。
您还可以添加“ time_to_edit”检查。 存储格式:| article_id | user_session_id | time_to_edit |
检查步骤2的'time_to_edit'值。如果用户编辑文章的时间过长,请使用新用户的会话ID重写其会话ID。如果“旧”用户将尝试保存文章-在“会话已过期”页面上重定向。
存储可以是您喜欢的任何东西:memcached,mysql表等。
您还可以检查存储,而无需通过Ajax调用重新加载页面。