Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用于登录身份验证的存储过程不起作用_Mysql_Stored Procedures_Cursor - Fatal编程技术网

Mysql 用于登录身份验证的存储过程不起作用

Mysql 用于登录身份验证的存储过程不起作用,mysql,stored-procedures,cursor,Mysql,Stored Procedures,Cursor,我正在使用MySQL数据库中的存储过程进行登录身份验证。 下面是代码,我写的,但它不工作。让我知道,怎么了 我有以下问题 如何检查光标是否为空或空 有没有办法,我们来写程序 我正在做的。。 获取两个输入参数和两个输出参数 检查用户或密码是否无效,并将这些值存储在OUT参数中 在oMessage、USERID中选择“无效用户名和密码”、“空” 如果用户和密码有效,但isActive列为0,则 在oMessage、USERID中选择“非活动帐户”、“空” 如果成功, 选择“Success”,将Use

我正在使用
MySQL
数据库中的
存储过程进行登录身份验证。
下面是代码,我写的,但它不工作。让我知道,怎么了

我有以下问题
  • 如何检查
    光标
    是否为
  • 有没有办法,我们来写程序
  • 我正在做的。。
  • 获取两个
    输入
    参数和两个
    输出
    参数

  • 检查用户或密码是否无效,并将这些值存储在OUT参数中
    在oMessage、USERID中选择“无效用户名和密码”、“空”

  • 如果用户和密码有效,但
    isActive
    列为
    0
    ,则
    在oMessage、USERID中选择“非活动帐户”、“空”

  • 如果成功,
    选择“Success”,将UserID添加到oMessage、UserID中

  • SQL代码
    你绝对不需要
    光标
    s;使用简单的
    选择
    。SP的更简洁版本可能如下所示

    DELIMITER $$
    CREATE DEFINER = `FreeUser`@`localhost` PROCEDURE `acl`.`checkAuthenticationTwo`
    (
        IN iUsername VARCHAR(50),
        IN iPassword VARCHAR(50),
        OUT oMessage VARCHAR(50),
        OUT oUserID INT
    )
    BEGIN
        SELECT CASE WHEN IsActive = 0 THEN 'Inactive account' ELSE 'Success' END,
               CASE WHEN IsActive = 0 THEN NULL ELSE UserID END 
          INTO oMessage, oUserID
          FROM m_users 
         WHERE (LoginName = TRIM(iUsername) 
               OR Email = TRIM(iUsername)) 
           AND `Password` = iPassword
         LIMIT 1; -- you better protect yourself from duplicates
        SET oMessage = IFNULL(oMessage, 'Invalid username and password');
    END$$
    DELIMITER ;
    它尝试选择一行,其中username或email等于iUsername,password等于iPassword,并向输出变量输出两个值。在此过程中,它使用
    CASE
    查看isActive值。如果是
    0
    ,则将消息设置为“非活动”,并将userid设置为NULL。否则,它将返回“Success”消息和已找到的真实用户ID。现在,如果未找到用户,则两个变量都将设置为NULL。我们可以利用这一点,使用
    IFNULL()
    函数来检测这一事实,并将消息设置为“无效用户名和密码”

    这里是演示 就我个人而言,我会进一步简化它,使其成为一个单语句SP,并具有以下界面:

    Returns: userid (which is > 0) if a user with username and password if found 0 - username and(or) password incorrect -1 - a user is inactive
    这里是演示

    你肯定不需要
    光标
    s;使用简单的
    选择
    。SP的更简洁版本可能如下所示

    DELIMITER $$
    CREATE DEFINER = `FreeUser`@`localhost` PROCEDURE `acl`.`checkAuthenticationTwo`
    (
        IN iUsername VARCHAR(50),
        IN iPassword VARCHAR(50),
        OUT oMessage VARCHAR(50),
        OUT oUserID INT
    )
    BEGIN
        SELECT CASE WHEN IsActive = 0 THEN 'Inactive account' ELSE 'Success' END,
               CASE WHEN IsActive = 0 THEN NULL ELSE UserID END 
          INTO oMessage, oUserID
          FROM m_users 
         WHERE (LoginName = TRIM(iUsername) 
               OR Email = TRIM(iUsername)) 
           AND `Password` = iPassword
         LIMIT 1; -- you better protect yourself from duplicates
        SET oMessage = IFNULL(oMessage, 'Invalid username and password');
    END$$
    DELIMITER ;
    它尝试选择一行,其中username或email等于iUsername,password等于iPassword,并向输出变量输出两个值。在此过程中,它使用
    CASE
    查看isActive值。如果是
    0
    ,则将消息设置为“非活动”,并将userid设置为NULL。否则,它将返回“Success”消息和已找到的真实用户ID。现在,如果未找到用户,则两个变量都将设置为NULL。我们可以利用这一点,使用
    IFNULL()
    函数来检测这一事实,并将消息设置为“无效用户名和密码”

    这里是演示 就我个人而言,我会进一步简化它,使其成为一个单语句SP,并具有以下界面:

    Returns: userid (which is > 0) if a user with username and password if found 0 - username and(or) password incorrect -1 - a user is inactive 这里是演示