MySQL存储过程,PDO :: fetch()在返回null

时间:2015-07-16 00:42:10

标签: php mysql stored-procedures pdo

问题是我使用存储过程来处理帐户验证。 (请注意,这是程序和方法的一个愚蠢版本,仅用于演示目的)。 注意:帐户身份验证不是此方法的最初目的,仅举例来说。

这是我的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正确时,该过程会打印出(或SELECTS)新的session_key,以便PHP可以获取它。但是,如果两个值中的一个不正确,则永远不会调用SELECT语句。

我认为这样会好的。如果返回一行 - >获取会话密钥(成功),如果没有返回该行,则验证失败,但显然不会那样。

返回的错误如下:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error'

只是为了重新迭代,只有(!(rc>0))时才会抛出此错误。

1 个答案:

答案 0 :(得分:1)

如果查询返回结果集,则只能使用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,否则它将返回一个包含会话密钥的数组。