簡體   English   中英

MySQL存儲過程PDO :: fetch()在返回null時引發一般錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM