我现在正在使用一个系统,该系统从数据库的表中提取记录,并在php中显示和处理此信息。如果要使用某些特定记录,我想锁定某些记录。
因此在此表中;我有一个“ 锁定”字段。每当我有要编辑的记录时,我都希望以表格形式显示信息,完成后,我想将 Lock 字段更新为“ 正在使用”。当另一个用户尝试访问该文件以对其进行编辑时,我正在运行的用于填充表单的php文件应首先检查是否已填充 Lock 字段。然后,如果确实确实填写了 Lock 字段,则会将其重定向并显示一条消息。
目前,我在以下方面遇到一些困难:1:更新和设置“锁定”字段; 2:确保拒绝任何用户(在其他浏览器或其他计算机上)访问记录。
目前,这是我的代码:
<?php
require 'connection information.php';
$conn = mysqli_connection($server, $username, $password);
$FileID = 123;
$checkLock = "SELECT RecordLock FROM `dataTable` WHERE FileID = '".$FileID."'";
$LockResult = mysqli_query($conn, $checkLock);
if(!empty(mysqli_fetch_array($LockResult)){ // the Lock is anything but empty the user will be shown this message
echo "this record is in use. try again later.";
}
else{// The lock is empty, they can edit the record
$getDatabaseInfo = "SELECT * FROM dataTable WHERE FileID = '".$FileID."'";
$databaseResults = mysqli_query($conn,$getDatabaseInfo);
while($mysqli_fetch_array($databaseResults)){
// this is where I auto populate/generate a form with all the information
}
$SetLock = "UPDATE dataTable SET RecordLock='*User's ID*' WHERE FileID ='".$FileID."'";
mysqli_query($conn,$SetLock);
}
?>
现在,我无法使$ SetLock查询通过,并且无法将Lock字段真正编辑为“正在使用”。 我这样做正确吗,有没有更优雅的方法?
编辑1:将$ conn添加到Mysqli_query($ SetLock);。 编辑2:将“锁定”查询更改为RecordLock。
答案 0 :(得分:-1)
我目前看到的最大问题是您没有跟踪表锁定的用户。
有可能事情会在多个请求上发生
这很重要,因为状态如何作用于客户端>服务器关系。
可能是您将记录设置为锁定状态,现在,当您查看该记录时,它确实按照您的指示执行了操作,以呼应:
echo "this record is in use. try again later.";
您缺少的是这样的:
$checkLock = "SELECT Lock FROM dataTable WHERE FileID = '".$FileID."' AND user_id != $currentUserId";
我不知道如何到达那里,因为我不知道数据库的架构,因此必须在其中添加一个用户字段来跟踪该数据。
无论如何,当用户返回以保存编辑时,您都需要此信息,然后您可以将它们从查询结果中排除,并且该表将“显示”为它们解锁(以便他们进行编辑)。
在不知情的情况下,我看不到其他任何方法。
答案 1 :(得分:-1)
仅查看代码,您在上次调用mysqli_query
函数时就缺少了$ conn变量。
还有其他人解释的锁定记录的更优雅的解决方案,因此值得一看。