mysql 触发器 传变量_PHP MySQL触发器 – 如何传递变量来触发?

修复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 triger有一个旧表,用于查看要删除的值.

Update触发器既有新旧,也有新旧.

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

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$$

解决方案

创建一个黑洞表.

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

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$$

关于触发器的注释

永远不要将密码以明文形式存储在数据库中.

始终使用最安全的哈希函数(当前具有512密钥长度的SHA2)将它们存储为salted哈希,如触发器所示.

您可以通过执行以下操作来测试是否有人拥有正确的密码:

SELECT * FROM user

WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)

要在 MySQL 触发器中调用 Python 脚本,你可以使用以下步骤: 1. 在 MySQL 中创建一个触发器,以便在特定事件发生时触发执行 Python 脚本。 2. 在 Python 中编写脚本,以便执行所需的操作。你可以使用 Python 的 MySQL 连接库(如 PyMySQL)与 MySQL 进行交互。 3. 在触发器中调用 Python 脚本,可以通过 shell 命令调用 Python 解释器来实现。例如,在 Linux 系统上,你可以使用以下命令: ``` `/usr/bin/python /path/to/your/python/script.py` ``` 4. 将该命令作为 MySQL 触发器中的 shell 命令调用即可。 需要注意的是,如果你的 Python 脚本需要接收参数,你需要在触发器中将这些参数传递给 shell 命令。可以使用 MySQL 的 `CONCAT()` 函数将参数拼接成字符串,然后在 shell 命令中解析这个字符串。 示例代码如下: ```mysql CREATE TRIGGER `my_trigger` AFTER INSERT ON `my_table` FOR EACH ROW BEGIN SET @args = CONCAT('arg1', ' ', 'arg2', ' ', NEW.`column`); SET @cmd = CONCAT('/usr/bin/python /path/to/your/python/script.py', ' ', @args); SET @result = sys_exec(@cmd); END; ``` 在这个示例中,我们创建了一个名为 `my_trigger` 的触发器,它会在 `my_table` 表中插入新行后触发。在触发器中,我们使用 `CONCAT()` 函数将三个参数拼接成字符串,并将其存储在变量 `@args` 中。然后,我们使用 `CONCAT()` 函数将 Python 解释器路径和脚本路径与 `@args` 拼接起来,存储在变量 `@cmd` 中。最后,我们调用 MySQL 的 `sys_exec()` 函数来执行 shell 命令并将结果存储在变量 `@result` 中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值