Я пытаюсь найти, как отправлять переменные в запросе на триггер, но это повлияет на вторую таблицу. Я использую это для создания таблицы журналов, в которой все, что обновляется или вставлено, записывается в таблицу журналов. Например
//Inserts into the table the username and password $sql = "INSERT INTO table VALUES ($_POST['username'], $_SESSION['password']);
Триггерные 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$$
Это возможно?
Исправьте, что 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!.
Обратите внимание, что хранение незашифрованных паролей в базе данных является кардинальным грехом.
См. Ниже, как это исправить.
Триггеры не позволяют параметры
Вы можете получить доступ только к значениям, которые вы только что вставили в таблицу.
Триггер Insert имеет для этого фиктивную таблицу.
У триггера Delete есть old
фиктивная таблица, чтобы увидеть значения, которые нужно удалить.
Триггер обновления имеет как old
и new
.
Кроме этого вы не можете получить доступ к каким-либо внешним данным.
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$$
Решение
Создайте таблицу черных дыр.
Таблицы Blackhole не хранят ничего, их единственная причина существования – для целей репликации, и поэтому вы можете прикреплять к ним триггеры.
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;
Затем вставьте данные в таблицу черных дыр и обработайте это с помощью триггера.
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$$
Примечания к триггеру
Вы никогда не должны хранить пароли в ящике в базе данных.
Всегда храните их как соленый хэш, используя самую безопасную хеш-функцию (в настоящее время SHA2 с длиной ключа 512) , как показано в триггере.
Вы можете проверить, есть ли у кого-то правильный пароль:
SELECT * FROM user WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)
связи
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
Как работает SQL-инъекция из комикса XBCD Bobby Tables?
Я не думаю, что это так.
Вы можете добавить столбцы userid
и patientid
в таблицу VALUES
, заполнить их во время исходной вставки и затем связать их с триггером при вставке в таблицу журналов.
alter table `baemer_emr`.`table1` add userId varchar(100); alter table `baemer_emr`.`table1` add patientId int unsigned;
а затем триггер:
DELIMITER $$ //Creates trigger to insert into table1 ( logs ) 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, NEW.userId, NEW.patientId); END$$ DELIMITER ;