我有两个实体(如下所示):
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)?
b。触发器中使用的@user_id是否将始终具有用户登录时设置的值?
C。当多个用户同时登录时会发生什么?
请帮忙。
最佳答案
每个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)没什么区别,因为每个用户将使用不同的数据库连接。