gpt4 book ai didi

php - MySql 触发器不执行任何操作

转载 作者:行者123 更新时间:2023-11-29 06:59:50 25 4
gpt4 key购买 nike

这可能是一些愚蠢的事情,但我无法弄清楚。问题是,当我想对 email_token 表执行检查时,它没有通过。我有一个简单的查询要更新所需的数据。但每次我的查询都得到错误。

这是:

DELIMITER $$

CREATE TRIGGER email_token_used
BEFORE INSERT
ON email_token FOR EACH ROW
BEGIN

IF(EXISTS(SELECT * FROM email_token WHERE used = 'N' AND usable = 'Y' AND user_id = NEW.user_id)) THEN
UPDATE email_token SET usable='N' WHERE user_id = NEW.user_id;
END IF;


END$$

这是我的表格: enter image description here

如果需要,这里是 php。它在没有触发器的情况下工作,邮件无法发送,因为它没有在表中更新:

if(!password_verify($password,$output['password'])){
self::$status = 401;
echo "Pass 1";
}else{
$mail_result = self::$db->query("INSERT INTO email_token(user_id,token,created,expires,used) VALUES('{$output['user_id']}','{$token}',NOW(),DATE_ADD(NOW(), INTERVAL 30 MINUTE),'N')");
if($mail_result){
echo "Pass 2";
$mailer = new Mailer();
$mailer -> send_mail("Token authentication","Token authentication <a href='http://localhost:8888/scripts/functions/collector/login/login_step_2.php?user_id={$token}'>Link</a>",$output['email']);
}else{
self::$status = 409;
echo "Error 1";
}
}

此处解释最终目标。用户登录后,他/她会获得一个 token ,该 token 将发送到他们的电子邮件(例如两站验证系统)。在获得 token 后,他们完成登录过程。我想防止人们拥有多个 token ,如果他们登录多次,他们将在电子邮件中收到 token 。 token 持续 2 分钟,我想在之前更新 token ,使其无效。

谢谢...

最佳答案

你已经触犯了

A stored function or trigger cannot modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html

我不知道为什么你首先需要一个触发器。似乎您遇到了可以使用 INSERT ON DUPLICATE KEY UDPATE 的情况。类似的东西

INSERT INTO email_token(user_id,token,created,expires,used)
VALUES(?,?,NOW(),DATE_ADD(NOW(), INTERVAL 30 MINUTE),'N')
ON DUPLICATE KEY UPDATE usable = 'Y'

请注意,您在查询中使用字符串连接。您应该改用准备好的语句。

根据您的评论。听起来您所需要的只是一个简单的 INSERT 语句(每次都需要插入记录)。前面是 UPDATE 语句

 UPDATE email_token SET usable='N' WHERE user_id = ?
INSERT INTO email_token(user_id,token,created,expires,used)
VALUES(?,?,NOW(),DATE_ADD(NOW(), INTERVAL 30 MINUTE),'N')

第一个使现有记录无效。第二个创造了新纪录。仍然不需要触发器。

关于php - MySql 触发器不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com