MySQL会话变量在触发器中的功能

时间:2014-06-12 07:55:09

标签: php mysql session

我有两个实体(如下所示): 1.用户 2.书籍

现在,每次用户删除图书时,我都有一项任务是在“日志表”中记录活动。 书籍和日志表的架构如下:

书表:

id      book
--      ----
1        B1
2        B2
3        B3
4        B4

日志表:

user    record_id     record_type    action
----    ---------     -----------    ------
12          7            book        delete

对于用户删除图书,他需要登录系统。 因此,一旦用户登录系统,我将获得其USERID并将其存储在PHP会话和MySQL会话变量中。

$_SESSION['user_id'] = $user_id;
mysqli_query("SET @user_id = $user_id");  //I am planning to use this value in my mysql trigger.

现在,要将条目存储在日志表中,我使用下面显示的触发器。

DROP TRIGGER IF EXISTS `book_delete`;
CREATE TRIGGER book_delete AFTER DELETE ON books
FOR EACH ROW
BEGIN
    INSERT INTO log_table(`user`, `record_id`, `record_type`, `action`)
    VALUES (@user_id, OLD.`books.id`, 'book','delete');
END;

我担心的是:

一个。我是否可以信任我的触发器中的MySQL变量(即@user_id)?

湾触发器中使用的@user_id是否总是具有用户登录时设置的值?

℃。当多个用户同时登录时会发生什么?

请帮忙。

1 个答案:

答案 0 :(得分:2)

每个PHP页面都可以使用一个或多个数据库连接 MySQL中的变量与已定义的连接密切相关(与连接一起生成并死亡,如果从未定义,则其值将为NULL)。
每次在PHP中创建新的数据库连接时,都必须定义并为变量赋予正确的值 这意味着:

...
$user_id = $_SESSION['user_id'];
...
$link = mysql_connect($server, $username, $password);
mysql_query("SET @user_id = $user_id", $link);
mysql_query("DELETE FROM book WHERE id = $book_id", $link);
...
mysql_close($link);
...

http://php.net/manual/en/function.mysql-connect.php
http://php.net/manual/en/function.mysql-query.php


这样:
a)您可以信任触发器中的变量,因为您定义并赋予它正确的值 b)是的,但它也取决于是,但它还取决于您编写的PHP代码 c)没有区别,因为每个用户将使用不同的数据库连接。