基于mysql表中唯一的电子邮件地址的唯一代码?

时间:2011-03-15 04:50:34

标签: php javascript mysql ajax

我有一个mysql表,用于存储用户的电子邮件地址(每个都是唯一的,是主要字段)和时间戳。
我添加了另一个名为'unique_code' (varchar(64), utf8_unicode_ci)的列。

我非常感谢帮助;

a)生成一个5位数的字母数字代码,即:5ABH6
b)检查'unique_code'列的所有行以确保它是唯一的,否则重新生成并再次检查
c)将唯一生成的5位字母数字代码插入'unique_code'列,对应于刚输入的电子邮件地址。
d)在屏幕上显示代码。

我必须放置什么代码?在哪里?

我目前的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('You are already on the notification list.');
        }

        if($ajax){
            die('{"status":1}');
        }

        $msg = "Thank you!";

    }
    catch (Exception $e){

        if($ajax){
            die(json_encode(array('error'=>$e->getMessage())));
        }

        $msg = $e->getMessage();        
    }
}

2 个答案:

答案 0 :(得分:2)

希望这会有所帮助:

a)我做了一些非常类似的事情,我正在生成用作网址的唯一代码。我写这个来生成代码:

private function _generateCode($length = 5) {

    $characters = 'bcdfghjkmnpqrstvwxyz';

    $string = '';
    for ($i = 0; $i < $length; $i++) {
        $string .= $characters[rand(0, strlen($characters) - 1)];
    }

    return $string;

}

$ characters是一串“允许”字符。我们选择删除元音,以便没有机会制作不需要的单词:)你可以改变它。有更简单的方法来编写它但我们需要一些非常具体的东西。

您可以这样使用它:

$unique_code = _generateCode();

b)为此,只需在select语句中包装insert语句,检查该唯一代码。如果代码存在,则生成另一个代码并重试。你可以做到这一点的一种方法是(注意:这没有经过测试,如果你碰巧遇到你已用完所有代码的情况,它可能会受到无限循环的影响;)你应该添加一个检查确保INSERT成功):

$unique_code = "";
$inserted = false;
// Keep looping until we've inserted a record
while(!$inserted) {
    // Generate a code
    $unique_code = _generateCode();
    // Check if it exists
    if ($result = mysqli->query("SELECT unique_code FROM coming_soon_emails WHERE unique_code = '$unique_code'")) {
        // Check no record exists
        if ($result->num_rows == 0) {
            // Create new record
            $mysqli->query("INSERT INTO coming_soon_emails (email,unique_code) VALUES ('" . $mysqli->real_escape_string($_POST['email']) . "','$unique_code')");
            // Set inserted to true to ext loop
            $inserted = true;
            // Close the result object
            $result->close();
        }
    } else {
        // Quit if we can't check the database
        die('Something went wrong with select');
    }   
}

// Output the code
echo $unique_code;

c)要插入唯一代码,只需将其添加到insert语句中,其中$ unique_code是指定上述函数返回值的变量:

$mysqli->query("INSERT INTO coming_soon_emails (email,unique_code) VALUES ('".$mysqli->real_escape_string($_POST['email'])."','$unique_code')");

d)只需将您指定代码的变量回显到例如:

echo $unique_code;

答案 1 :(得分:1)

稍微更优雅的解决方案是使用MySQL为您完成大部分工作,方法是将unique_code字段类型设置为VARCHAR(5)并在其上放置UNIQUE索引。然后,您可以使用查询:

$sql = "UPDATE coming_soon_emails SET `unique_code` = MD5(CONCAT(`email`, NOW()))
        WHERE `email` = {$email}";

,您的PHP代码如下所示:

while(!$mysqli->query($sql)) {
    // If the error that was thrown wasn't a duplicate key problem,
    // something else is wrong (ie can't connect to MySQL server).
    if($mysqli->errno != 1062) {
        // Error handling code
        break;
    }
}

使用这种方法,移动到更长的唯一代码(例如6个字符)就像将unique_code字段更改为长度为6一样简单。