2011-09-16 14 views
5

我正在通過圖書館的一本書學習MySQL和PHP。我被更改密碼存儲從在MySQL Query中使用NOW()時可能會延遲嗎?

password=SHA('password') 

提高密碼加密系統的安全性,

password=SHA(CONCAT('password', '--', registration_date)) 

其中registration_date是當用戶註冊的時間戳。

當前的代碼註冊用戶是:

INSERT INTO users (first_name, last_name, email, password, registration_date) 
VALUES ('first_name', 'last_name', 'email', SHA(CONCAT('password', '--', NOW())), NOW()); 

我需要擔心的兩個不同的NOW()函數在那裏?他們有可能有稍微不同的時間?我嘗試了幾個查詢,它似乎工作正常。

如果有問題,我該如何解決?

+0

您最好非常非常非常非常確定registration_date字段永遠永遠不會得到更新。否則,你會發現自己的用戶突然短缺。 –

+0

@Larry - 這也適用於密碼字段。 :) –

回答

3

沒有問題。從manual

NOW()返回一個常量時間,指示語句開始執行的時間。 (在一個存儲函數或觸發器,NOW()返回在其功能或觸發語句開始執行的時間。)

由於手冊通過示例示出,一個語句中的NOW()各評價返回相同的值,而不管評估之間已經過了多少時間。

0

在一臺服務器上,您不必擔心。從文檔:

NOW()返回一個常量時間,指示 語句開始執行的時間。

(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_now)所以這個值在一個查詢中不會改變。

雖然你應該注意基於聲明的複製。如果有可能以這種方式複製數據庫(例如備份或HA),則從屬設備可能與主設備有不同的NOW()

+0

關於SBR的好處。主從設備可能確實有不同的NOW()值。但是,從機的一行中的NOW()的值將與該行中的相同。 (我認爲這是OP所關心的可能會失敗。)如果主和從屬的NOW()值之間的差異是一個問題,那麼基於行的複製就修復了這個問題。或者,也可以用'SET TIMESTAMP'(影響'NOW()')的值來玩遊戲來解決問題。 –

相關問題