Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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
使用SELECT resultset对MySQL存储过程运行更新查询_Sql_Mysql_Stored Procedures_Resultset - Fatal编程技术网

使用SELECT resultset对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

我试图了解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 ;
如何根据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;