gpt4 book ai didi

Mysql存储过程通过测试数据库中是否存在记录来返回状态

转载 作者:行者123 更新时间:2023-11-29 17:49:29 25 4
gpt4 key购买 nike

下面是我的简单存储过程,用于通过测试数据库中是否存在记录来获取状态。在这里,我传递用户名和密码,即使密码错误,我的状态也为 true。当用户名和密码都正确时,我的状态应该为 true,否则为 false。如果记录存在,我需要拉出该行,请告诉我哪里出错了。

查询调用

call login("abc","abc");

SP

DELIMITER $$;

DROP PROCEDURE IF EXISTS `test`.`login`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `login`(IN UserName varchar(50),IN Passowrd varchar(50))
BEGIN
DECLARE status VARCHAR(10);

IF EXISTS(SELECT 1 FROM register where UserName=UserName and Passowrd=Passowrd)
THEN
SET @status = 'TRUE';
SELECT @status as status;
SELECT * FROM register where UserName=UserName and Passowrd=Passowrd;
ELSE
SET @status = 'FALSE';
SELECT @status as status;


END IF;
END$$

DELIMITER ;$$

最佳答案

我同意关于使用函数而不是过程进行此测试的其他观点,但我认为人们忽略了此过程不起作用的真正原因。也就是说,它将始终获得 TRUE 状态,因为查询将每个列值与自身进行比较,而不是与调用过程所用的参数进行比较。

请注意,参数的名称与正在测试的列的名称完全相同。

SELECT 查询忽略参数并提出问题:“表中是否存在一条记录,其中该列等于其自身,并且该列也等于其自身?”回答"is"(只要表中至少有一条记录)。

这解释了密码不匹配时的 TRUE 状态。

尝试这个测试

mysql> create table abc (UserName varchar(12),Passowrd varchar(12));
Query OK, 0 rows affected (0.47 sec)

mysql> insert into abc value ('always','true');
Query OK, 1 row affected (0.16 sec)

mysql> select exists
(select 1 from abc where UserName = UserName AND Passowrd = Passowrd);
+------------------------------------------------------------------------------+
| exists (select 1 from abc where UserName = UserName AND Passowrd = Passowrd) |
+------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------+
1 row in set (0.00 sec)

您需要更改参数名称和查询,以便它们测试参数而不是每一列本身。

例如

CREATE PROCEDURE `login`(IN p_UserName varchar(50),IN p_Passowrd varchar(50))

以及测试

SELECT 1 FROM register where UserName = p_UserName  and Passowrd = p_Passowrd) 

SELECT * FROM register where UserName = p_UserName  and Passowrd = p_Passowrd;         

关于Mysql存储过程通过测试数据库中是否存在记录来返回状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49512141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com