我正在尝试了解MySQL存储过程,我想检查用户登录凭据是否有效,如果有效,请更新用户在线状态:
-- DROP PROCEDURE IF EXISTS checkUser;
DELIMITER //
CREATE PROCEDURE checkUser(IN in_email VARCHAR(80), IN in_password VARCHAR(50))
BEGIN
SELECT id, name FROM users WHERE email = in_email AND password = in_password LIMIT 1;
-- If result is 1, UPDATE users SET online = 1 WHERE id = "result_id";
END //
DELIMITER ;
如何基于结果集行数== 1或id IS NOT NOT来创建if语句?
答案 0 :(得分:7)
DELIMITER //
CREATE PROCEDURE checkUser(IN in_email VARCHAR(80), IN in_password VARCHAR(50))
BEGIN
DECLARE tempId INT DEFAULT 0;
DECLARE tempName VARCHAR(50) DEFAULT NULL;
DECLARE done INT DEFAULT 0;
DECLARE cur CURSOR FOR
SELECT id, name FROM users WHERE email = in_email AND password = in_password;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO tempId, tempName;
UPDATE users SET online = 1 WHERE id = tempId;
UNTIL done = 1 END REPEAT;
CLOSE cur;
SELECT tempName;
END //
DELIMITER ;
注意:我没有测试过这个。 MySQL可能不喜欢UPDATE对象当前有一个游标打开的表。
PS:你应该重新考虑how you're storing passwords。
重新评论RETURN
与OUT
对比结果集:
RETURN
仅用于存储函数,而不用于存储过程。如果要在另一个SQL表达式中调用例程,则使用存储函数。
SELECT LCASE( checkUserFunc(?, ?) );
您可以使用OUT
参数,但必须首先声明用户变量作为该参数传递。然后你必须选择那个用户变量才能获得它的价值。
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
从存储过程返回结果集时,最简单的方法是使用SELECT
查询。
答案 1 :(得分:2)
使用:
UPDATE USERS
SET online = 1
WHERE EXISTS(SELECT NULL
FROM USERS t
WHERE t.email = IN_EMAIL
AND t.password = IN_PASSWORD
AND t.id = id)
AND id = 'result_id'
为什么SELECT上有LIMIT 1
?你真的希望电子邮件和密码不止一次出现在数据库中吗?
答案 2 :(得分:0)
如果您的结果返回1,则可以尝试使用if语句 我看了你的代码,它似乎没有回归真实所以你必须重构它, 如上所述omg写道,这真的是真的为什么你的选择查询中有一个限制1,其中只有一个电子邮件地址可以存在? 像这样的东西
update users set if(result==1,online=1,online=0) where email=emailadress