2011-03-15 68 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