PHP MySQL触发器 - 如何传递变量来触发?

Sky*_*ght 3 php mysql triggers

我试图找到如何将查询中的变量发送到触发器,但它会影响第二个表.我正在使用它来创建一个日志表,其中任何更新或插入的内容都会记录在日志表中.例如

//Inserts into the table the username and password
$sql = "INSERT INTO table VALUES ($_POST['username'], $_SESSION['password']);
Run Code Online (Sandbox Code Playgroud)

触发DDL语句

DELIMITER $$

//Creates trigger to insert into table1 ( logs ) the userid and patientid ( which has to come from php )
USE `baemer_emr`$$

CREATE
DEFINER=`baemer_emr`@`localhost`
TRIGGER `table1`.`after_insert`
AFTER INSERT ON `baemer_emr`.`table1`
FOR EACH ROW
BEGIN
  INSERT INTO table2 VALUES (NEW.idn, $_POST[userid], $_SESSION[patientid]);
END$$
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Joh*_*ica 12

修复SQL注入

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$sql = "INSERT INTO table1 VALUES ('username','password'); 
// You must quote your $vars       ^        ^ ^        ^  like this
// or syntax errors will occur and the escaping will not work!. 
Run Code Online (Sandbox Code Playgroud)

请注意,将未加密的密码存储在数据库中是一个重要的罪过.
请参阅下文,了解如何解决此问题.

触发器不允许参数
您只能访问刚刚插入表中的值.
Insert触发器有一个虚拟表new.
Delete triger有一个虚拟表,old用于查看要删除的值.
Update触发器具有oldnew.

除此之外,您无法访问任何外部数据.

DELIMITER $$    

//Creates trigger to insert into table1 ( logs ) the userid and patientid ( which has to come from php )    

CREATE    
TRIGGER ai_table1_each AFTER INSERT ON `baemer_emr`.`table1`    
FOR EACH ROW    
BEGIN    
  INSERT INTO table2 VALUES (NEW.idn, NEW.username, NEW.patientid);    
END$$    
Run Code Online (Sandbox Code Playgroud)

解决方案
创建一个黑洞表.
黑洞表不存储任何内容,它们存在的唯一理由是复制目的,因此您可以将触发器附加到它们.

CREATE TABLE bh_newusers (
  username varchar(255) not null,
  password varchar(255) not null,
  idn integer not null,
  patient_id integer not null,
  user_id integer not null) ENGINE = BLACKHOLE;
Run Code Online (Sandbox Code Playgroud)

接下来将数据插入到黑洞表中并使用触发器进行处理.

CREATE    
TRIGGER ai_bh_newuser_each AFTER INSERT ON `baemer_emr`.bh_newuser
FOR EACH ROW    
BEGIN    
  DECLARE newsalt INTEGER;
  SET newsalt = FLOOR(RAND()*999999);
  INSERT INTO users (username, salt, passhash) 
    VALUES (NEW.username, newsalt, SHA2(CONCAT(newsalt, password), 512));
  INSERT INTO table2 VALUES (NEW.idn, NEW.username, NEW.patient_id);
END$$    
Run Code Online (Sandbox Code Playgroud)

关于触发器的注意事项
永远不要将密码以明文形式存储在数据库中.
始终使用最安全的哈希函数(当前具有512密钥长度的SHA2)将它们存储为salted哈希,如触发器所示.
您可以通过执行以下操作来测试是否有人拥有正确的密码:

SELECT * FROM user 
WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)
Run Code Online (Sandbox Code Playgroud)

链接
http://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html
http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html
存储MySQL 中的哈希密码
如何从"Bobby Tables"XKCD漫画中注入SQL?