使用SELECT resultset对MySQL存储过程运行更新查询
我试图了解MySQL存储过程,我想检查用户登录凭据是否有效,如果有效,请更新用户联机状态:使用SELECT resultset对MySQL存储过程运行更新查询,sql,mysql,stored-procedures,resultset,Sql,Mysql,Stored Procedures,Resultset,我试图了解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
-- 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 ;
如何根据resultsets的行数==1或id不为NULL生成此if语句?使用:
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'
为什么您的选择上有
限制1
?您真的希望电子邮件和密码在数据库中出现不止一次吗?如果结果返回1,您可以尝试使用if语句
我看了你的代码,似乎没有任何东西返回真值,所以你必须重构它,
正如上面omg写到的,这是真的,为什么在select查询中只有一个emailAddress可以存在的限制为1?
类似这样的东西
update users set if(result==1,online=1,online=0) where email=emailadress
注:我还没有测试过这个。MySQL可能不喜欢针对其当前打开的游标表进行更新
附言:你应该重新考虑
重新评论
RETURN
与OUT
与结果集:
RETURN
仅用于存储函数,而不用于存储过程。要在另一个SQL表达式中调用例程时,将使用存储函数
SELECT LCASE( checkUserFunc(?, ?) );
您可以使用OUT
参数,但必须首先声明一个用户变量才能作为该参数传递。然后,您必须选择该用户变量以获取其值
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;
从存储过程返回结果集时,最容易使用
SELECT
查询 谢谢你的快速回答,是的,限制1是无用的,我会删除那个。还有一件事,我想将用户名(从SELECT子查询)返回到PHP脚本。如何设置“return”变量或创建子查询的返回结果集?@Tirithen:您可以使用return子句,也可以使用IN-OUT参数。OUT参数意味着您向查询提供了一个参数,它将/应该在内部填充&您可以在以后使用该参数。稍后我会更新更多信息,但现在请看:@Bill:使用SELECT vs RETURN或OUT参数有什么好处吗?此答案中的第一个代码工作正常,谢谢您的回答。花了一段时间才明白,但现在我明白了。:-)现在我正在加密我的密码(不是MD5和单向)三次,其中两次使用不同的盐和不同的加密方法,所以我认为这就足够了。在我看来,这样一根绳子真的很难用暴力来对付。这些似乎都是你给我的链接的总结。你在想什么呢?不,如果你使用的是强散列函数和每个用户随机的salt,那就足够了。我担心您将密码存储为纯文本,因为您只是将密码中的与数据库字段与=
运算符进行比较。干杯
SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;