【问题标题】:Unique code based on unique email address in mysql table?基于mysql表中唯一电子邮件地址的唯一代码?
【发布时间】:2011-07-15 12:36:17
【问题描述】:

我有一个 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();        
    }
}

【问题讨论】:

  • 5 位字母数字代码意味着您的系统可以包含的唯一代码数量为 60,466,176 个唯一代码。
  • 5 字符代码的用途是什么?如果它是电子邮件地址的函数,如何在不使用不同算法的情况下在发生冲突的情况下生成第二个代码?如果没有,为什么简单的自动递增序列号不起作用?
  • 为什么需要唯一代码?
  • @thephpdeveloper:这就够了:)
  • @Jim Garrison:添加为引荐来源网址,即:example.com/5ABH6。一旦验证了电子邮件地址(有效的电子邮件并检查它尚不存在),它应该在下一列中分配一个与该用户行关联的唯一代码。

标签: php javascript mysql ajax


【解决方案1】:

希望这会有所帮助:

a) 我做了一些与此非常相似的事情,我生成了用作 URL 的唯一代码。我写这个是为了生成代码:

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) 为此,只需将您的插入语句包装在一个选择语句中,检查该唯一代码。如果代码存在,则生成另一个代码并重试。您可以这样做的一种方法是(注意:这未经测试,如果您碰巧遇到用完所有代码的情况,它可能容易陷入无限循环;)并且您可能应该添加一个检查确保 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) 要插入唯一代码,只需将其添加到您的插入语句中,其中 $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;

【讨论】:

  • @Shane Garelja:非常感谢!我将讨论一下 select 语句。我已经谈到了它,但肯定需要更多地理解这种语言。删除元音的好主意!
  • 没问题 :) 很高兴为您提供帮助。这是您的选择语句上的一个小指针,可以帮助您开始:“SELECT unique_code FROMcoming_soon_emails WHERE unique_code = '$unique_code'” - 现在您只需要自己弄清楚如何询问结果并确定是否需要生成另一个代码或者您是否可以安全地插入新的电子邮件记录。
  • 让我猜猜.. put $unique_code = _generateCode();以及循环中的 SELECT 语句(并确定列中是否 $unique_code = any)?我一定会阅读这个的。再次感谢你:)
  • @Shane Garelja: 这个怎么样 :) if($unique_code = mysqli_query("SELECT unique_code FROM coming_soon_emails WHERE unique_code = '$unique_code'")){ while($row = mysqli_fetch_assoc($unique_code)){ _generateCode(); $mysqli->query("INSERT INTOcoming_soon_emails (email,unique_code) VALUES ('".$mysqli->real_escape_string($_POST['email'])."','$unique_code')"); }
  • @jeremycollins - 你有一些问题,所以我在我的答案中添加了一个例子并发表了评论,希望它能帮助你理解正在发生的事情。仅供参考 - 你所拥有的一些问题:1)“mysqli_query”是程序风格的调用,需要一个指向连接对象的指针作为第一个参数。 2)您将其分配给一个名为 $unique_code 的变量 - 查询函数返回一个必须查询的结果对象。 3) _generateCode() 未分配给变量。 4) INSERT 语句引用了 $unique_code 这是一个 mysql 结果对象:)
【解决方案2】:

一个更优雅的解决方案是使用 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 一样简单。

【讨论】:

  • 谢谢 :) 只是尝试上述方法,如果不行,我会测试你的。
猜你喜欢
  • 2018-07-08
  • 2014-05-23
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多