2011-03-15 41 views
2

我有一个mysql表,它将存储用户的电子邮件地址(每个都是唯一的,是主场)和时间戳。
我已经添加了另一列名为'unique_code' (varchar(64), utf8_unicode_ci)基于mysql表中唯一邮件地址的唯一代码?

我非常感谢帮助,

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();   
    } 
} 
+0

5位字母数字代码意味着系统可以包含的唯一代码数量为60,466,176个唯一代码。 – mauris 2011-03-15 04:53:19

+0

5字符代码的目的是什么?如果它是电子邮件地址的函数,那么如何在不使用不同算法的情况下生成第二个代码?如果不是,为什么简单的自动增量序列号不起作用? – 2011-03-15 04:54:27

+0

为什么你需要一个唯一的代码? – Jacob 2011-03-15 04:55:05

回答

2

希望这有助于:

一)我确实非常相似,这个东西我在那里产生,其将被使用的唯一代码作为URL。我写这个来生成代码:

private function _generateCode($length = 5) { 

    $characters = 'bcdfghjkmnpqrstvwxyz'; 

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

    return $string; 

} 

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

你会使用这样的:

$unique_code = _generateCode(); 

B)对于这个只是包装你的INSERT语句select语句检查为唯一代码。如果代码存在,则生成另一个代码并重试。你可以这样做的一种方式是(注意:这是没有经过测试的,如果你碰巧遇到了你已经用完所有代码的情况,它可能会受到无限循环的影响;)你应该添加一个支票以确保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)只是回显您分配代码的变量到e.g:

echo $unique_code; 
+0

@Shane Garelja:谢谢你太多了!我会在选择声明方面捅一捅。我已经谈到了它,但肯定需要更多地理解语言。删除元音的好主意! – jeremycollins 2011-03-15 08:53:25

+0

没问题:)很高兴帮助。这里是你的select语句中的一个指针,让你开始:“SELECT unique_code FROM coming_soon_emails WHERE unique_code ='$ unique_code'” - 现在你只需要弄清楚如何询问结果并确定是否需要生成另一个代码或者您是否可以安全地插入新的电子邮件记录。 – 2011-03-15 09:13:37

+0

让我猜猜..把$ unique_code = _generateCode();和SELECT语句(并确定$ unique_code =列中的任何)在循环中?我肯定会读到这一个..再次感谢你:) – jeremycollins 2011-03-15 09:23:03

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.

+0

谢谢你:)只是尝试上述方法,如果没有去,我会测试你的一个。 – jeremycollins 2011-03-15 15:23:08