Есть ли проблема в моем триггере? - PullRequest
1 голос
/ 27 марта 2019

После создания оператора триггера я не могу нормально вставить данные, но программа выдает ошибку: код ошибки 1109: неизвестная таблица 'user' в списке полей.

--create table
CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `email` varchar(45) DEFAULT NULL,
  `username` varchar(45) NOT NULL,
  `password` varchar(45) NOT NULL,
  `phone_number` int(11) DEFAULT NULL,
  `type` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--create trigger
DELIMITER $$
CREATE TRIGGER Checkinfo
    before INSERT ON dbi_202x.user FOR EACH ROW 
    BEGIN
        if( user.email not REGEXP '^[^@]+@[^@]+\.[^@]{2,}$')
        THEN 
            SET new.email = `wrong email`;
        end if;
    END;
$$
--insert data
INSERT INTO `dbi_202x`.`user`(`user_id`,`email`,`username`,`password`,`phone_number`,`type`)VALUES(
396812,
'sdf@sxcv.com',
'sadfk23',
'asdf',
1369846978,
'employee');

Можете ли вы помочь мне выяснить, почему это не работает?

1 Ответ

1 голос
/ 27 марта 2019

Вы можете протестировать регулярное выражение в клиенте MySQL без использования триггера:

mysql> select 'user@example.com' REGEXP '^[^@]+@[^@]+\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
|           1 |
+-------------+

Это ожидается, но как насчет того, чтобы мы дали ему недействительный адрес электронной почты?

mysql> select 'user@example.' REGEXP '^[^@]+@[^@]+\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
|           1 |
+-------------+

Это должно быть 0, но почему бы и нет?

Потому что \. недостаточно, чтобы избежать точки в регулярном выражении. Один \ теряется, когда SQL анализирует строку. Нам нужно, чтобы литерал \ был в строке регулярного выражения, чтобы избежать точки. Таким образом, мы должны использовать двойной \\, чтобы единственный литерал \ оставался в регулярном выражении после того, как MySQL его отсканировал один раз.

mysql> select 'user@example.' REGEXP '^[^@]+@[^@]+\\.[^@]{2,}$' as email_match;
+-------------+
| email_match |
+-------------+
|           0 |
+-------------+

P.S. Для чего это стоит, электронные письма являются более сложными, чем ваша простая проверка. Этот старый архивированный блог имеет несколько попыток всесторонней проверки электронной почты: https://web.archive.org/web/20150910045413/http://squiloople.com/2009/12/20/email-address-validation

Самым успешным из них стало регулярное выражение, используемое в PHP FILTER_VALIDATE_EMAIL .

...