这可能是一些愚蠢但我无法解决的问题。问题是,当我想对 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$$
这是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";
}
}
这里最终目标的解释。 用户登录,他/她获得一个发送到他们的电子邮件的令牌(如2站验证系统)。他们获得令牌后,他们完成登录过程。我想阻止人们拥有多个令牌,如果他们多次登录,他们将在他们的电子邮件中获得令牌。令牌持续2分钟,我想更新令牌之前无效。
...谢谢
答案 0 :(得分:1)
你违反了
存储的函数或触发器无法修改已经存在的表 被调用的语句用于(读或写) 功能或触发器。
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')
第一个使现有记录无效。第二个创建一个新记录。仍然不需要触发器。
答案 1 :(得分:1)
试试这样:
{{1}}