MYSQL:使用if语句的过程

Lin*_*qan 2 mysql stored-procedures if-statement

我正在尝试创建一个首先检查用户密码的例程,如果它是正确的,它将从不同的表返回一些值或更改一行中的某些值.

如果没有在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
Run Code Online (Sandbox Code Playgroud)

这就是我到目前为止所得到的:

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
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

Joh*_*ica 7

您应该真正散列这些密码,使用以下代码

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 ;
Run Code Online (Sandbox Code Playgroud)

salt是在表中的额外字段user是或多或少随机的,但不必是秘密的.它有助于击败彩虹桌.
您可以将salt设置为短字符串char(10)或随机数据.例如

salt = ROUND(RAND(unix_timestamp(now())*9999999999);
Run Code Online (Sandbox Code Playgroud)

您不需要更新salt,只需生成一次然后存储它.

有关此问题的更多信息,请参阅:
使用PHP和MySQL保存哈希值
我应如何合乎道德地接近用户密码存储以便稍后检索明文?

对您的代码发表评论

IF(@PassOld == in_PassOld) THEN  //incorrect 
IF(@PassOld = in_PassOld) THEN   //correct, SQL <> PHP :-)
Run Code Online (Sandbox Code Playgroud)