MySql触发器没有执行任何操作

时间:2017-05-10 12:37:17

标签: php mysql

这可能是一些愚蠢但我无法解决的问题。问题是,当我想对 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";
        }
      }

这里最终目标的解释。 用户登录,他/她获得一个发送到他们的电子邮件的令牌(如2站验证系统)。他们获得令牌后,他们完成登录过程。我想阻止人们拥有多个令牌,如果他们多次登录,他们将在他们的电子邮件中获得令牌。令牌持续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}}