2011-09-27 85 views
2

我想做一個例程,首先檢查用戶密碼,如果它是正確的,它應該返回不同表中的某些值或更改一行中的某些值。MYSQL:使用if語句的過程

這甚至可能沒有在PHP中處理兩個查詢?首先調用密碼,檢查它的正確性,然後允許用戶更改名稱。

這裏是通過電子郵件和密碼獲取用戶行的示例。

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_user_info`(
    IN in_Email VARCHAR(45), 
    IN in_Pass VARCHAR(45) 
    ) 
BEGIN 
    SELECT * FROM User WHERE Email = in_Email AND Pass = in_Pass; 
END 

這是什麼Ive得到了迄今:

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
    in_Email VARCHAR(45), 
    in_PassOld VARCHAR(45), 
    in_PassNew VARCHAR(45) 
) 
BEGIN 
    SET @PassOld = (SELECT Pass From User WHERE Email = in_Email); 

    IF(@PassOld = in_PassOld) THEN 
     UPDATE User SET Pass = in_PassNew WHERE Email = in_Email; 

    END IF; 

ENDND IF; 
END 

感謝所有幫助!

+1

永遠不要在明確存儲密碼在數據庫中。使用鹽漬散列代替,請參閱這裏爲什麼:http://stackoverflow.com/questions/2283937/how-should-i-ethically-approach-user-password-storage-for-later-plaintext-retriev和這裏爲如何:http://stackoverflow.com/questions/3273293/salting-my-hashes-with-php-and-mysql – Johan

回答

5

你真的應該散列這些密碼,使用下面的代碼

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `change_pass`(
    in_Email VARCHAR(45), 
    in_PassOld VARCHAR(45), 
    in_PassNew VARCHAR(45) 
) 
BEGIN 
    DECLARE KnowsOldPassword INTEGER; 

    SELECT count(*) INTO KnowsOldPassword 
    FROM User 
    WHERE Email = in_Email AND passhash = SHA2(CONCAT(salt, in_PassOld),512); 
    IF (KnowsOldPassword > 0) THEN 
    UPDATE User 
     SET Passhash = SHA2(CONCAT(salt, inPassNew),512) 
     WHERE Email = in_Email; 
    END IF; 
END $$ 

DELIMITER ; 

salt是表user這或多或少是隨機的額外字段,但並不需要是祕密。它有助於擊敗rainbow tables
您可以將salt設置爲短字符串char(10)或隨機數據。例如

salt = ROUND(RAND(unix_timestamp(now())*9999999999); 

您不需要更新鹽,只需生成一次,然後存儲它。

有關這方面的問題,請參見:
Salting my hashes with PHP and MySQL
How should I ethically approach user password storage for later plaintext retrieval?

一個評論對你的代碼

IF(@PassOld == in_PassOld) THEN //incorrect 
IF(@PassOld = in_PassOld) THEN //correct, SQL <> PHP :-) 
+0

通過已經鹽漬。例程是爲我:)所以我知道如何寫它。 – Linqan

+0

我嘗試刪除鹽的東西,只是去的IF聲明,但它不會爲我工作 – Linqan

+0

不要忘記設置'分隔符;'完成存儲的過程後,否則如果不會運行,因爲它使用了錯誤的分隔符。 – Johan