我的MySQL数据库中的正则表达式不起作用

时间:2015-04-04 23:58:49

标签: php mysql regex triggers xampp

我的MySQL服务器中的正则表达式检查似乎没有起作用,或者我犯了一个非常明显的错误(对不起,如果是的话,我就是无法发现它)。

Regular expression

触发器:trig_check_memebers

事件:INSERT

表:tbl_members

声明: 开始 IF(NEW.member_email REGEXP'^(\ w + @ \ w +。\ w +)$')= FALSE THEN SIGNAL SQLSTATE'12345' SET MESSAGE_TEXT ='无效的电子邮件'; 万一; END

计时:之前

创建:NULL

的sql_mode:NO_ENGINE_SUBSTITUTION

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

Regex tester

我知道它是一个糟糕的正则表达式我刚刚开始学习它并且想测试基本的东西,比如我知道如果有像xxx.yyy@foo.bar那样的电子邮件它就不会有相同的结果。

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

Test data

INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt',     'you@you.you');

Test data

Error
  SQL query:


  INSERT INTO tbl_members VALUES ('jeff', 'password', 'hardy', 'jeff', 'matt',     'you@you.you')
  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 \'^(\\\\w+@\\\\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', 'you@you.you')");
    //$dbc->query();
    $dbc->close();
    ?>

如果有人想知道为什么我要删除并创建数据库:代码实际上永远不会在服务器上,因此对于我的任务,我可以在任何服务器上运行脚本,所以我不必依赖引入我的电脑来展示它是如何工作的。导师可以在他的上面创建它来创建它,它也适用于我的数据库模块,所以在一个位置拥有所有sql也对我的参考等有好处。

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

最重要的答案是让我获得触发码的原因。

1 个答案:

答案 0 :(得分:0)

将正则表达式更改为:

^[A-Za-z_]+@[A-Za-z_]+\\.[A-Za-z_]+$