我需要创建一个用户活动日志,然后将其插入到数据库中。为此,我正在考虑使用mysql触发器,而不是放置一个查询,在每个成功的查询上执行此操作。 这两张桌子完全没有关系。 这是一个例子:
table_fruits
table_log
table_users
现在每次我在表水果上插入时,也会执行将值插入table_log的触发器。我的问题是获取存储在另一个表中的用户ID。如何确定要插入的用户ID。据我所知,触发器不需要参数,所以我不能用它来从我的脚本提供id。 有任何想法吗?我应该只使用存储过程吗?
答案 0 :(得分:1)
有三种方法:
如您所述,使用存储过程插入主表和日志表
将用户ID(由应用提供)存储为主(水果)表中的一列,作为" inserted_by"柱;然后让触发器填充日志表并从主表中读取用户。
让触发器自动找出用户ID。这有两种风格:
用户ID存在于应用程序端,但不存在于数据库端(例如,用户登录到网页,但CGI后端代码始终作为特殊数据库连接到数据库" http"数据库用户)。
来自应用程序的用户ID实际上连接到DB作为具有相同名称的数据库用户。
在这种情况下,您应该使用 USER()
(但是不 current_user()
而是返回创建触发器的人,或者更准确地说, ID用于触发权限检查)
答案 1 :(得分:1)
当你插入水果表时,你也知道user_id值。
我建议像这样创建一个黑洞表:
CREATE TABLE bh_fruit (
user_id integer not null,
fruit_name varchar(255),
flavor varchar(255)
) ENGINE = BLACKHOLE;
在黑洞桌上放一个扳机。
DELIMITER $$
CREATE TRIGGER ai_bh_fruit_each AFTER INSERT ON bh_fruit FOR EACH ROW
BEGIN
INSERT INTO fruit (fruit_name, flavor) VALUES (NEW.fruit_name, NEW.flavor);
INSERT INTO log (user_id, tablename) VALUES (NEW.user_id, 'fruit');
END $$
DELIMITER ;
现在您的PHP代码变为:
$user_id = mysql_real_escape_string($user_id);
$fruit = mysql_real_escape_string($fruit);
$flavor = mysql_real_escape_string($flavor);
$sql = "INSERT INTO bh_fruit (user_id, fruit_name, flavor)
VALUES ('$user_id','$fruit','$flavor')";