2015-07-10 26 views
3

我的問題有點棘手,無法找到有效表達它的正確方式。 我創建了一個獨特的激活字符串/鏈接,它在PHP中結合了哈希用戶名和時間。 但是,將數據發送到我的數據庫的確切時間以及將電子郵件激活鏈接發送到用戶電子郵件帳戶所需的實際時間不同(可能以毫秒爲單位,有時也可能是秒) - 這基本上意味着我有不同的電子郵件激活鏈接從我的數據庫和電子郵件帳戶 讓我給的代碼片段:爲電子郵件激活鏈接生成唯一字符串PHP

$username = $_POST[‘username’]; 
$table = ‘users’; 
$activate_field = ‘activate’; 
$activate_code = md5($_POST[‘username’]) + time(); //provides unique code for activating 
//few more lines of code then… 
$query = $connect-> prepare(「INSERT INTO $table $acivate_field VALUES $activate_code」); 
$query->execute(); 

//then the long code for sending the email with the activation code appended to the user’s email account 

有可能產生的唯一字符串每秒的更好的辦法? 感謝您的時間,並感謝任何幫助和/或suggestions.P.S我使用phpmailer發送電子郵件。

+1

您可以簡單地採取唯一字段(例如電子郵件或用戶名)和'md5'。在這方面它將是獨一無二的。 – Andrew

+1

這是正常的,時間不同,你只需要使用一次兩種操作。隨着您將信息保存在數據庫中,這是一項成本更高的操作。你必須使用這段時間來發送鏈接和其他需要的操作。 – Miguel

+1

那麼'$ activate_code'的值應該只評估一次,所以沒有理由他們應該不同。 '時間'已經在幾秒鐘內。你確定'//更多的代碼行...'部分沒有修改'$ activate_code'嗎? – hoss

回答

2

只需編寫生成的代碼變量,然後變到郵件和數據庫 我可以看到你已經擁有的代碼保存在變量,包括它在查詢

在一個側面說明之前,您應該不能訪問超全局變量像$ _POST直接作爲用戶輸入可能是惡意 和你應該使用PDO同樣的原因編制報表,而不是字符串內置查詢

+2

我看到$ _POST被使用的唯一位置,它是'md5''d,這將導致SQL安全的字符串。只要'$ username'不會直接放入SQL查詢中,這看起來很好。 –

1

您可以md5,與uniqid組合和time所以它也將唯一的相同第二。

$activate_code = md5(uniqid(time())); 
3

在MySQL UUID()是更好不過uniqid() PHP中microtime中的前綴可以是一個好球。

+0

PHP uniqid已經基於microtime,不需要在microtime前加上前綴。只有在多個主機上生成ID時才需要前綴(爲了確保唯一性,您需要告訴每個主機使用不同的前綴) – ccKep