【问题标题】:MySQL give wrong output when same procedure is called consecutively当连续调用相同的过程时,MySQL给出错误的输出
【发布时间】:2023-03-30 22:51:01
【问题描述】:

我创建了一个根据用户电子邮件和密码获取用户个人资料的程序

当密码错误时 STATUS = 2

当电子邮件错误时 STATUS = 0

当两者都正确时 STATUS = 1

现在的问题是当连续调用这个过程时(整个查询一次给出下面),对于第一个过程,电子邮件和密码是正确的 STATUS = 1 收到但在第二个过程中,如果电子邮件是错误的,它仍然给出 STATUS = 1 但是它应该给出 0。但如果我一次调用一个过程,它会给出正确的结果。

-- Correct email and pass
CALL GetUserProfile("ankit11101998@gmail.com","abcde", @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg); SELECT @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg;
-- Wrong email and pass
CALL GetUserProfile("aaaaaankit11101998@gmail.com","abcde", @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg); SELECT @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg;

正确电子邮件的结果并通过

+---------+--------------+----------+-----------+-------------------------+-------+---------+
| @status | @PhoneNumber | @country | @photo    | @emailId                | @name | @msg    |
+---------+--------------+----------+-----------+-------------------------+-------+---------+
|       1 | 6284567890   |       93 | imagelink | ankit11101998@gmail.com | akash | success |
+---------+--------------+----------+-----------+-------------------------+-------+---------+

错误邮件的结果并通过

+---------+--------------+----------+--------+----------+-------+---------+
| @status | @PhoneNumber | @country | @photo | @emailId | @name | @msg    |
+---------+--------------+----------+--------+----------+-------+---------+
|       1 | NULL         |     NULL | NULL   | NULL     | NULL  | success |
+---------+--------------+----------+--------+----------+-------+---------+

GetUserProfile 过程

CREATE DEFINER=`admin`@`%` PROCEDURE `GetUserProfile`(IN `UserSignUp` VARCHAR(350), IN `pWord` TEXT, OUT `status` INT, OUT `PhoneNumber` TEXT, OUT `country` INT, OUT `userphoto` TEXT, OUT `emailId` TEXT, OUT `username` TEXT, OUT `msg` TEXT)
   READS SQL DATA
   COMMENT '0 = user dont exists, 1 = success, 2 - wrong pword'
BEGIN
  SET @yesNo = 0;
  CALL UserAuth( UserSignUp, pWord,  @yesNo );
  IF @yesNo = 0 THEN                           
     SET msg = "user don't exists";
  END IF;
  IF @yesNo = 1 THEN 
     SELECT name, email, photo, mobile_no, countryCode INTO  username, emailId, userphoto, PhoneNumber, country FROM App_users
     WHERE  email = LOWER ( UserSignUp ) AND password = pWord ;
     SET msg = "success";
  END IF;
  IF @yesNo = 2 THEN
     SET msg = "wrong password";  
  END IF;
  SET status = @yesNo;
END

用户验证过程

CREATE DEFINER=`admin`@`%` PROCEDURE `UserAuth`(IN `UserEmail` VARCHAR(350), IN `PWord` TEXT, OUT `success` INT)
    READS SQL DATA
    COMMENT ' status =2 :  pw error, status =0: user dont extsts'
BEGIN

SET success = 0;
SELECT password INTO @Word FROM App_users WHERE email = LOWER( UserEmail );

IF  @Word IS NOT NULL THEN
    IF @Word = PWord THEN
        SET success = 1;
    ELSE
        SET success = 2;
    END IF;
END IF;

结束

任何人都可以帮助或提出解决此问题的建议。提前谢谢你。

【问题讨论】:

标签: mysql sql database stored-procedures logic


【解决方案1】:

您的 se3cond 调用不会覆盖会话变量@word,因此每次调用它时都必须重置

并且不要以纯文本形式保存密码

CREATE TABLE App_users
    (`PhoneNumber` bigint, `country` int, `photo` varchar(9), `email` varchar(23),`mobile_no` int 
    , `name` varchar(5), `password` varchar(5),`countryCode` int)
;
INSERT INTO App_users
    (`PhoneNumber`, `country`, `photo`, `email`,`mobile_no`, `name`,`password`,`countryCode`)
VALUES
    (6284567890, 93, 'imagelink', 'ankit11101998@gmail.com', 11111, 'akash','abcde', 99)
;
CREATE PROCEDURE `GetUserProfile`(IN `UserSignUp` VARCHAR(350), IN `pWord` TEXT, OUT `status` INT, OUT `PhoneNumber` TEXT, OUT `country` INT, OUT `userphoto` TEXT, OUT `emailId` TEXT, OUT `username` TEXT, OUT `msg` TEXT)
   READS SQL DATA
   COMMENT '0 = user dont exists, 1 = success, 2 - wrong pword'
BEGIN
  SET @yesNo = 0;
  CALL UserAuth( UserSignUp, pWord,  @yesNo );
  IF @yesNo = 0 THEN                           
     SET msg = "user don't exists";
  END IF;
  IF @yesNo = 1 THEN 
     SELECT name, email, photo, mobile_no, countryCode INTO  username, emailId, userphoto, PhoneNumber, country FROM App_users
     WHERE  email = LOWER ( UserSignUp ) AND password = pWord ;
     SET msg = "success";
  END IF;
  IF @yesNo = 2 THEN
     SET msg = "wrong password";  
  END IF;
  SET status = @yeso;
END
CREATE  PROCEDURE `UserAuth`(IN `UserEmail` VARCHAR(350), IN `PWord` TEXT, OUT `success` INT)
    READS SQL DATA
    COMMENT ' status =2 :  pw error, status =0: user dont extsts'
BEGIN
SET @Word = '';
SET success = 0;
SELECT password INTO @Word FROM App_users WHERE email = LOWER( UserEmail );

IF  @Word IS NOT NULL THEN
    IF @Word = PWord THEN
        SET success = 1;
    ELSE
        SET success = 2;
    END IF;
END IF;
END
-- Correct email and pass
CALL GetUserProfile("ankit11101998@gmail.com","abcde", @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg); 
SELECT @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg;
-- Wrong email and pass
✓ @状态 | @电话号码 | @国家 | @照片 | @emailId | @姓名 | @msg ------: | :----------- | --------: | :-------- | :------------------------ | :---- | :------ | 11111 | 99 |图片链接 | ankit11101998@gmail.com |阿卡什 |成功 ✓
CALL GetUserProfile("aaaaaankit11101998@gmail.com","abcde", @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg); 
SELECT @status, @PhoneNumber, @country, @photo, @emailId, @name, @msg;
✓ @状态 | @电话号码 | @国家 | @照片 | @emailId | @姓名 | @msg ------: | :----------- | --------: | :----- | :------- | :---- | :------------- | | | | | |密码错误

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2018-01-06
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2018-02-09
    相关资源
    最近更新 更多