我无法使更新功能正常工作。该函数标记了徽章,因此它们在通知窗口中隐藏。
当用户单击按钮将其标记为已显示时,将调用该函数。
我在桌面上有两个触发器,它试图更新,我认为这可能导致问题。
问题是:无法更新存储函数/触发器中的表'users',因为它已被调用此存储函数/触发器的语句使用。
触发器:
功能:
function markAsSeen() {
require "connect.php";
$seen = mysqli_query($connection,"Update userbadges
INNER JOIN users ON users.id = userbadges.user_id
SET seen='1'
WHERE studentid = '".$_SESSION["studentid"]."' && seen=0") or die(mysqli_error($connection));
while ($data = mysqli_fetch_array($seen)) {
echo 'Done';
}
}
有什么方法吗?
答案 0 :(得分:0)
您的问题是update_users_trigger
触发器更改了表users
的内容,而触发此触发器执行的查询也使用了表users
。< / p>
您需要调整查询,以免发生此死锁。我们不清楚每个表格中的哪些字段,但我怀疑您在初始查询中需要加入users
,以便您可以在studentid
上进行查询。
您可以创建一个不同的函数来获取您需要的用户ID,如下所示:
require_once "connect.php";
function getUserIDFromStudentID($student_id, mysqli $connection)
{
$query = 'SELECT id FROM users WHERE studentid = ? LIMIT 1';
$stmt = $connection->prepare($query);
// Replace the below s to an i if it's supposed to be an integer
$stmt->bind_param("s", $student_id);
$stmt->execute();
$result = $stmt->get_result();
$record = $result->fetch_object();
$result->free();
if ($record) {
return $record->id;
}
}
function markAsSeen(mysqli $connection) {
$user_id = getUserIDFromStudentID($_SESSION["studentid"], $connection);
if (! $user_id) {
throw new Exception('Unable to get user id');
}
$seen_query = 'UPDATE userbadges SET seen = 1 WHERE user_id = ? and seen = 0';
$stmt = $connection->prepare($seen_query);
// Replace the below s to an i if it's supposed to be an integer
$stmt->bind_param("s", $user_id);
$result = $stmt->execute();
if (! $result) {
die(mysqli_error($connection));
}
echo 'Done';
}
传递连接对象而不是每次都需要全局文件,这样可以提供更大的灵活性。