功能/触发器已在使用中?

时间:2015-06-23 10:37:05

标签: php html mysql mysqli

我无法使更新功能正常工作。该函数标记了徽章,因此它们在通知窗口中隐藏。

当用户单击按钮将其标记为已显示时,将调用该函数。

我在桌面上有两个触发器,它试图更新,我认为这可能导致问题。

问题是:无法更新存储函数/触发器中的表'users',因为它已被调用此存储函数/触发器的语句使用。

触发器:

enter image description here

功能:

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';


  }
}

有什么方法吗?

1 个答案:

答案 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';
}

传递连接对象而不是每次都需要全局文件,这样可以提供更大的灵活性。