[英]MySQL Stored procedure, PDO::fetch() throws general error on null return
问题是我正在使用存储过程来处理我的帐户的验证。 (请注意,这是该过程和方法的简化版本,仅用于演示目的)。 注意 :帐户身份验证不是此方法的初衷,仅举例来说。
这是我的示例MySQL过程:
BEGIN
DECLARE rc INT(11);
DECLARE new VARCHAR(40);
SET new = uuid();
UPDATE accounts SET session_key = new WHERE account_id = id_in AND session_key = session_in;
SELECT ROW_COUNT() into rc;
IF(rc > 0) THEN
SELECT new AS `session_key`;
END IF;
END
这是附带的与PHP相关的代码:
private static function authenticate() {
$connection = Database::getConnection();
$account = 19;
$session = "cc73e13b-2983-11e5-8ade-00163e603fb4";
$statement = $connection->prepare("CALL AUTH_SESSION(:account, :session);");
$statement->bindParam(":account", $account);
$statement->bindParam(":session", $session);
if($statement->execute()) {
if($row = $statement->fetch()) {
echo 'valid session';
} else {
echo 'invalid session';
}
} else {
echo 'failed to execute query';
}
}
当session_key和account_id正确时,该过程将打印(或选择)新的session_key
以便PHP可以获取它。 但是,当两个值之一不正确时,将永远不会调用SELECT语句。
我认为这会很好。 如果返回一行->获取会话密钥(成功),并且如果未返回该行,则验证失败,但是显然不能那样进行。
返回的错误如下:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error'
仅重申一下,此错误仅在(!(rc>0))
时抛出。
仅当查询返回结果集时才可以使用fetch()
,即存储过程必须返回SELECT
的结果。
当rc > 0
为false时,您可以让过程返回空结果集。
BEGIN
DECLARE rc INT(11);
DECLARE new VARCHAR(40);
SET new = uuid();
UPDATE accounts SET session_key = new WHERE account_id = id_in AND session_key = session_in;
SELECT ROW_COUNT() into rc;
SELECT new AS session_key
FROM dual
WHERE rc > 0;
END
调用fetch()
,如果结果集为空,它将返回false
,否则将返回包含会话密钥的数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.