在DB中自动生成唯一的字母数字?

时间:2011-03-16 02:16:27

标签: php mysql

我的数据库中有3列:电子邮件(主要),unique_code,时间戳

  1. 用户输入他们的电子邮件地址并将其添加到数据库中。 每次用户这样做时,我希望该行中的“unique_code”列自动生成一个独特的5位字母数字(0-9,A-Z)代码。我更喜欢DB做这方面的所有工作,但我不知道如何。

  2. 接下来我需要向用户显示该代码(与其行对应的代码)。

  3. 我如何解决这两个问题?

    谢谢!


    字段类型排序规则属性空默认额外操作
    email varchar(64)utf8_unicode_ci否无
    unique_code varchar(64)utf8_unicode_ci否无
    更新时间戳时间戳CURRENT_TIMESTAMP否CURRENT_TIMESTAMP

    指标
    PRIMARY BTREE是否电子邮件7 A

    编辑:(完整代码)

    <?php
    
    require "includes/connect.php";
    
    $msg = '';
    
    if($_POST['email']){
    
        // Requested with AJAX:
        $ajax = ($_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest');
    
        try{
            if(!filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)){
                throw new Exception('Invalid Email!');
            }
    
            $mysqli->query("INSERT INTO coming_soon_emails
                            SET email='".$mysqli->real_escape_string($_POST['email'])."'");
    
            if($mysqli->affected_rows != 1){
                throw new Exception('This email already exists in the database.');
            }
    
            if($ajax){
                die('{"status":1}');
            }
    
            $msg = "Thank you!";
            $mysqli->query("INSERT INTO coming_soon_emails VALUES('email', SUBSTRING(MD5(UUID()),FLOOR(RAND()*25),5), UNIX_TIMESTAMP())");
    echo "Something went wrong:" . $mysqli->error;
        }
        catch (Exception $e){
    
            if($ajax){
                die(json_encode(array('error'=>$e->getMessage())));
            }
    
            $msg = $e->getMessage();        
        }
    }
    ?>
    
    
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>example</title>
    
    <link rel="stylesheet" type="text/css" href="css/styles.css" />
    
    </head>
    
    <body>
    
    <div id="container">
    
        <form id="form" method="post" action="">
            <input type="text" id="email" name="email" value="<?php echo $msg?>" />
            <input type="submit" value="Submit" id="submitButton" />
        </form>
    
        <div id="thankyou">
        Thank you! <?php echo $unique_code;?></p>
        </div>
    
    
    </div>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
    <script src="js/script.js"></script>
    </body>
    </html>
    

3 个答案:

答案 0 :(得分:0)

也许是这样的

SELECT SUBSTRING(MD5(UUID()),FLOOR(RAND()*25),5) as id;

或者,你如何使用它 -

INSERT INTO `table` VALUES('email', SUBSTRING(MD5(UUID()),FLOOR(RAND()*25),5), UNIX_TIMESTAMP())

答案 1 :(得分:0)

code列转换为自动递增的unique索引:

ALTER TABLE mytable 
    ADD code INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE;

然后将您的自动增量设置为从5位开始(例如10000):

ALTER TABLE tbl AUTO_INCREMENT = 10000;

你可以把它组合成一个陈述,但我不是那么好:/

然后,您可以使用LAST_INSERT_ID()获取代码列值

答案 2 :(得分:0)

在MySQL中无法做到这一点,您需要一个计算列,并且不支持它们。

你可以做的是,有一个标准的自动递增整数然后当你获取记录时将整数(基数为10)转换为某个基数的另一个整数(在你的情况下为36 - 26个字母+10个数字)会给出一个字符串。