Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Sql 函数未返回预期值_Sql_Postgresql_Sql Update_User Defined Functions_Plpgsql - Fatal编程技术网

Sql 函数未返回预期值

Sql 函数未返回预期值,sql,postgresql,sql-update,user-defined-functions,plpgsql,Sql,Postgresql,Sql Update,User Defined Functions,Plpgsql,我创建了一个函数,理论上,成功更改密码时返回true,反之返回false 该功能定义为: CREATE OR REPLACE FUNCTION database."changePassword"(username character varying, newpassword character varying, oldpassword character varying) RETURNS boolean AS $BODY$ UPDATE database.users SET hash = MD5

我创建了一个函数,理论上,成功更改密码时返回true,反之返回false

该功能定义为:

CREATE OR REPLACE FUNCTION database."changePassword"(username character varying, newpassword character varying, oldpassword character varying) RETURNS boolean AS
$BODY$
UPDATE database.users SET hash = MD5($2) WHERE (username = $1 AND hash = MD5($3));
SELECT EXISTS(SELECT 1 FROM datsabase.users WHERE username = $1 AND hash = MD5($2))
$BODY$
LANGUAGE sql VOLATILE NOT LEAKPROOF
COST 100;
问题是,当我调用
SELECT数据库之类的函数时,“changePassword”('usrNm','newPassword','oldOne'),首先我得到了预期的true,并且数据库中的值发生了更改

当我使用相同的参数再次(一次又一次)调用函数时,它也会返回true,但情况不应该是这样,因为密码现在已更改,并且通过函数调用发送的旧密码不正确

我做错什么了吗

PostgreSQL版本是9.3.1。

我从pgAdmin接口和PHP脚本调用了该函数,同样的问题。

该函数的返回值是
SELECT
语句的结果。当存储的用户哈希与第二个参数(
newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否更新。

函数的返回值是
SELECT
语句的结果。当存储的用户哈希与第二个参数(
newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否更新。

函数的返回值是
SELECT
语句的结果。当存储的用户哈希与第二个参数(
newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否更新。

函数的返回值是
SELECT
语句的结果。当存储的用户哈希与第二个参数(
newpassword
)的哈希匹配时,结果为真。当密码更改为新密码时,此检查始终成功,并且函数为同一参数返回true,尽管update语句在第二次调用后不会更新任何行。您应该更改逻辑,而不是查询匹配的用户和密码,而是检查任何行是否已更新。

如果您想返回任何密码是否已更改,您只需在plpgsql函数中返回特殊变量,如下所示(通过@Pavel输入简化):

或者更简单地说,使用
RETURNING
子句。这也适用于普通sql函数:

CREATE OR REPLACE FUNCTION database."changePassword"(
    username character varying
   ,newpassword character varying
   ,oldpassword character varying
) RETURNS boolean AS
$func$

UPDATE database.users
SET    hash = MD5($2)
WHERE  username = $1
AND    hash = MD5($3)
RETURNING TRUE;

$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;

如果没有更新行,则不会返回任何内容。否则,您将获得
TRUE

如果您想返回密码是否已更改,您只需返回plpgsql函数中的特殊变量,如下所示(通过@Pavel的输入简化):

或者更简单地说,使用
RETURNING
子句。这也适用于普通sql函数:

CREATE OR REPLACE FUNCTION database."changePassword"(
    username character varying
   ,newpassword character varying
   ,oldpassword character varying
) RETURNS boolean AS
$func$

UPDATE database.users
SET    hash = MD5($2)
WHERE  username = $1
AND    hash = MD5($3)
RETURNING TRUE;

$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;

如果没有更新行,则不会返回任何内容。否则,您将获得
TRUE

如果您想返回密码是否已更改,您只需返回plpgsql函数中的特殊变量,如下所示(通过@Pavel的输入简化):

或者更简单地说,使用
RETURNING
子句。这也适用于普通sql函数:

CREATE OR REPLACE FUNCTION database."changePassword"(
    username character varying
   ,newpassword character varying
   ,oldpassword character varying
) RETURNS boolean AS
$func$

UPDATE database.users
SET    hash = MD5($2)
WHERE  username = $1
AND    hash = MD5($3)
RETURNING TRUE;

$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;

如果没有更新行,则不会返回任何内容。否则,您将获得
TRUE

如果您想返回密码是否已更改,您只需返回plpgsql函数中的特殊变量,如下所示(通过@Pavel的输入简化):

或者更简单地说,使用
RETURNING
子句。这也适用于普通sql函数:

CREATE OR REPLACE FUNCTION database."changePassword"(
    username character varying
   ,newpassword character varying
   ,oldpassword character varying
) RETURNS boolean AS
$func$

UPDATE database.users
SET    hash = MD5($2)
WHERE  username = $1
AND    hash = MD5($3)
RETURNING TRUE;

$func$
LANGUAGE sql VOLATILE NOT LEAKPROOF;

如果没有更新行,则不会返回任何内容。否则,您将得到
TRUE

这个“FOUND”变量是布尔值,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。“FOUND”变量是布尔变量,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。“FOUND”变量是布尔变量,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。“FOUND”变量是布尔变量,因此您可以简化代码-只需使用“RETURN FOUND”@PavelStehule:当然!我通常不会错过这样一个简单化的好机会。应用这个。