我正在设计这个页面,用户将看到当天的变更单。我只需要一个人一次编辑一个变更单。而其他用户仍可以编辑其他变更单。我粘贴的代码是最后一页,用户在点击特定的变更单后被重定向。请帮我举个例子,因为我对php和mysql非常陌生。提前谢谢`
<?php
$change = $_GET['value'];
mysqli_query('BEGIN');
$sql="SELECT * FROM cat_firewall USE INDEX(id) WHERE chg_id='$change' FOR UPDATE";
$result=mysqli_query($con,$sql);
// Count table rows
$count=mysqli_num_rows($result);
?>
---MORE CODE----
while ($row = mysqli_fetch_array($result)){ ?>
<tr>
---MORE CODE----
<?php
$source_FW = $_POST['source_FW'];
$source_ACL = $_POST['source_ACL'];
$destination_FW = $_POST['destination_FW'];
$destination_ACL = $_POST['destination_ACL'];
if(isset($_POST['Submit'])){
foreach($source_FW as $key=>$value){
$sql1="UPDATE cat_firewall SET source_FW='$value' WHERE entry_id='$key' AND chg_id='$change' ";
$result=mysqli_query($con,$sql1);
}
foreach($source_ACL as $key1=>$value1){
$sql2="UPDATE cat_firewall SET source_ACL='$value1' WHERE entry_id='$key1' AND chg_id='$change' ";
mysqli_query($con,$sql2);
}
foreach($destination_FW as $key2=>$value2){
$sql3="UPDATE cat_firewall SET destination_FW='$value2' WHERE entry_id='$key2' AND chg_id='$change' ";
mysqli_query($con,$sql3);
}
foreach($destination_ACL as $key3=>$value3){
$sql4="UPDATE cat_firewall SET destination_ACL='$value3' WHERE entry_id='$key3' AND chg_id='$change' ";
mysqli_query($con,$sql4);
}
echo "update complete";
}
sleep(120);
mysqli_query($con,'COMMIT');
?>'
`
1条答案
按热度按时间z5btuh9x1#
我想在用户单击变更单并进入此页面编辑行时锁定它,并在单击提交按钮后释放对行的锁定。
那是一面很大的红旗。您不应该期望innodb锁定以人类的速度运行。
光学版本:
有发生的更新的序列号。
在用户开始查看值并挠头时获取该数字。
让用户(以最快的速度)进行更改。
现在将更新和序列号发送回客户端api,客户端api
以下内容:
悲观的方法。。。
现在继续让用户做他想做的事情。但是,最后,清楚了
who_is_editing
.警告:如果用户只是消失了,这个“锁”可能永远不会被释放。所以。。。
找份工作检查一下。
警告用户输入更改的时间有限。
在更新事务中验证用户是否仍然匹配
who_is_editing
. 如果你不打他一巴掌,告诉他“你花了太长时间!”。(警告:这两种方法都是草率输入的;请仔细研究,寻找逻辑上的漏洞。)