2014-06-12 34 views
0

我有两个实体(如下图所示)的: 1.用户 2.图书运作,触发MySQL的会话变量

现在,我有一个任务记录“日志表”用户每次活动删除一本书。 对本书的架构和日志表如下:

书表:

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。多个用户同时登录时会发生什么情况?

请帮忙。

回答

1

每个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


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