Cette requête crée une vue mysql qui capture les mauvais formats d'adresse e-mail dans une table. Donc, si une ligne est insérée qui a rtrrg.com
en tant qu'e-mail, il sera enregistré dans la vue. Ma question est, comment puis-je faire la piste de vue plus d'une table. Une deuxième table.
Le SQL
CREATE VIEW `invalid_emails` AS
select `table_with_email_column`.`email` AS `invalidemail`
from `table_with_email_column`
where ((locate(_latin1'', ltrim(rtrim(`table_with_email_column`.`email`))) <> 0)
or (left(ltrim(`table_with_email_column`.`email`), 1) = _latin1'@')
or (right(rtrim(`table_with_email_column`.`email`), 1) = _latin1'.')
or ((locate(_latin1'.', `table_with_email_column`.`email`,locate(_latin1'@', `table_with_email_column`.`email`)) - locate(_latin1'@', `table_with_email_column`.`email`)) <= 1)
or ((length(ltrim(rtrim(`table_with_email_column`.`email`))) - length(replace(ltrim(rtrim(`table_with_email_column`.`email`)), _latin1'@', _latin1''))) <> 1)
or (locate(_latin1'.', reverse(ltrim(rtrim(`table_with_email_column`.`email`)))) < 3)
or (locate(_latin1'.@', `table_with_email_column`.`email`) <> 0)
or (locate(_latin1'..', `table_with_email_column`.`email`) <> 0));
Vous pouvez utiliser un pur SELECT
pour valider les adresses e-mail:
SELECT * FROM `users` WHERE `email` NOT REGEXP '^[^@]+@[^@]+\.[^@]{2,}$';
Et maintenant, pour votre question de suivi de plusieurs tables, vous pouvez utiliser des noms de table séparés par des virgules, n'est-ce pas?
SELECT * FROM `users`, `customers`, `clients`
WHERE `email` NOT REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$';
Pour la validation correcte de l'email, vous pouvez utiliser cette expression régulière comme ci-dessous:
SELECT
*
FROM
`school`
WHERE
`email` NOT REGEXP '^[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9._-]@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]\\.[a-zA-Z]{2,63}$';
Une simple instruction SELECT
suffit, par exemple:
SELECT * FROM user WHERE email NOT
REGEXP '^[a-zA-Z0-9][+a-zA-Z0-9._-]*@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]*\\.[a-zA-Z]{2,4}$'
Cette requête gère les adresses Gmail avec +
signe et adresse où l'hôte est une seule lettre.
Vous pouvez utiliser un UNION
dans le VIEW
mais vous devez ensuite répéter toute l'instruction WHERE
qui vous donne un code redondant. Donc, vous feriez un helper VIEW
qui fait de vous un UNION
et ensuite appliquer la clause WHERE
.
Démo ici: SQL Fiddle Demo.
Cela s'appliquerait à votre SQL en quelque sorte comme ceci (non testé);
CREATE VIEW `invalid_emails_helper` AS
select `table_with_email_column`.`email` AS `invalidemail`
from `table_with_email_column`
union
select `table_with_email_column`.`email`
from `second_table_with_email_column`
CREATE VIEW `invalid_emails` AS
select `invalidemail` as `email`
from `invalid_emails_helper` as `table_with_email_column`
where ((locate(_latin1'', ltrim(rtrim(`table_with_email_column`.`email`))) <> 0)
or (left(ltrim(`table_with_email_column`.`email`), 1) = _latin1'@')
or (right(rtrim(`table_with_email_column`.`email`), 1) = _latin1'.')
or ((locate(_latin1'.', `table_with_email_column`.`email`,locate(_latin1'@', `table_with_email_column`.`email`)) - locate(_latin1'@', `table_with_email_column`.`email`)) <= 1)
or ((length(ltrim(rtrim(`table_with_email_column`.`email`))) - length(replace(ltrim(rtrim(`table_with_email_column`.`email`)), _latin1'@', _latin1''))) <> 1)
or (locate(_latin1'.', reverse(ltrim(rtrim(`table_with_email_column`.`email`)))) < 3)
or (locate(_latin1'.@', `table_with_email_column`.`email`) <> 0)
or (locate(_latin1'..', `table_with_email_column`.`email`) <> 0));
Et oui, la requête pour vérifier l'adresse e-mail à l'aide d'un regex
comme on peut facilement la trouver partout sur Internet la simplifie davantage.
SELECT
*
FROM
users
WHERE
email NOT REGEXP ‘ ^[ a - zA - Z0 - 9 ][ a - zA - Z0 - 9._ -]*[ a - zA - Z0 - 9 ]@[ a - zA - Z0 - 9 ][ a - zA - Z0 - 9._ -]*[ a - zA - Z0 - 9 ]\.[ a - zA - Z ]{ 2,
63 } $’