2015-04-04 84 views
1

我的MySQL服务器中的正则表达式检查似乎没有工作,或者我犯了一个非常明显的错误(对不起,如果是这样,我只是不能发现它,如果是这样)。我在我的MySQL数据库中的正则表达式不起作用

Regular expression

触发:trig_check_memebers

事件:INSERT

表:tbl_members

声明: BEGIN IF(NEW.member_email REGEXP“^(\ w + @ \ w +。 \ w +)$')= FALSE THEN SIGNAL SQLSTATE'12345' SET MESSAGE_TEXT ='invalid email'; END IF; END

时间:BEFORE

创建:NULL

的sql_mode:NO_ENGINE_SUBSTITUTION

所以这是我的触发器只是为了显示正则表达式我有,它会突出显示。这是我的证据(可能是错误的),它适用于我想输入的数据。

Regex tester

我知道它不好的正则表达式我刚开始学习它,并想测试基本的东西,像我知道,如果有喜欢的[email protected]它不会有相同的结果的电子邮件。

这里是我的测试数据产生的错误。

Test data

INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt',  '[email protected]'); 

Test data

Error 
    SQL query: 


    INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt',  '[email protected]') 
    MySQL said: Documentation 

    #1644 - invalid email 

^不是真正的代码,错误消息。

<?php 
    //Variables 
    $database_name; 
    $dbc; 
    $table_create_queries; 
    $triggers; 
    //Initialization 
    $database_name = 'PolySoft'; 
    $dbc = new mysqli('localhost', 'root', null); 

    $table_create_queries = array 
    (
     //Members Table 
     'tbl_members' => 'CREATE TABLE tbl_members(member_username varchar(40) NOT NULL, 
     member_password varchar(60) NOT NULL, 
     member_surname varchar(40) NOT NULL, 
     member_forename varchar(40) NOT NULL, 
     member_othernames varchar(40), 
     member_email varchar(254), 
     UNIQUE(member_email), 
     PRIMARY KEY(member_username));' 
     , 
     //Addresses Table 
     'tbl_addresses' => 'CREATE TABLE tbl_addresses(address_postcode varchar(10) NOT NULL, 
     address_country varchar(255) NOT NULL, 
     address_county varchar(255), 
     address_city varchar(255) NOT NULL, 
     address_town varchar(255), 
     address_street varchar(255) NOT NULL, 
     address_house_name_or_number varchar(255) NOT NULL, 
     PRIMARY KEY(address_postcode));' 
    ); 
    $triggers = array 
    (
     'check_members' =>'CREATE TRIGGER trig_check_memebers 
      BEFORE INSERT ON tbl_members 
      FOR EACH ROW 
      BEGIN 
       IF (NEW.member_email REGEXP \'^(\\\\[email protected]\\\\w+\\\\.\\\\w+)$\') = FALSE THEN 
        SIGNAL SQLSTATE \'12345\' 
        SET MESSAGE_TEXT = \'invalid email\'; 
       END IF; 
      END;' 
    ); 

    $dbc->query("DROP DATABASE IF EXISTS $database_name"); 
    $dbc->query("CREATE DATABASE $database_name"); 
    $dbc->close(); 
    $dbc = new mysqli('localhost', 'root', null, $database_name); 
    foreach($table_create_queries as $tbl => $query) 
    { 
     $dbc->query($query); 
    } 
    foreach($triggers as $trig => $query) 
    { 
     $dbc->query($query); 
    } 
    $dbc->query("INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt', '[email protected]')"); 
    //$dbc->query(); 
    $dbc->close(); 
    ?> 

如果你想知道为什么我删除和创建数据库:代码永远不会实际上是在服务器上,它使我的任务我可以在任何服务器上运行脚本,所以我不要”不得不依靠引入我的个人电脑来显示它的工作原理。导师可以只对他执行这个创建它,它也是我的数据库模块也因此拥有一个位置的所有SQL也不错供我参考等

Is it Possible to Enforce Data Checking in MySQL using Regular expression

顶部答案是什么给了我触发代码。

+0

我搞掂你的图像。现在我已经这样做了,如果你可以将第一,第三和第四个替换为文本,那就太棒了!正则表达式测试器的图像是非常有用的,但其他所有图像都可以复制和粘贴,而这对图像来说是不可能的(您会发现这是对使用图像的常见反应 - 人们会问你文本的版本 - 代码,错误消息等)。 – halfer 2015-04-05 00:49:09

+0

(除了那些反馈,这是一个很好的问题,我认为你会很快得到一个答案,详细程度。) – halfer 2015-04-05 00:49:59

回答

0

您正则表达式更改为:

^[A-Za-z_][email protected][A-Za-z_]+\\.[A-Za-z_]+$ 
+0

IF(NEW.member_email REGEXP'^ [:word:] + @ [:word:] + \。[:word:] + $')= FALSE THEN 这是最终的正则表达式应该是什么样子,它也不起作用。 – 2015-04-05 01:14:49

+0

我需要额外的'\'还是像我所假设的那样逃避'\'? – 2015-04-05 01:16:17

+0

@Fat_Llama我不信任mysql中的'\ w',不确定它的引擎是否支持。这就是为什么我把第二个选项。 – 2015-04-05 01:32:00

相关问题