4

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 ;

結果セットの行数 == 1 または id IS NOT NULL に基づいて、この if ステートメントを作成するにはどうすればよいですか?

4

3 に答える 3

8
DELIMITER //
CREATE PROCEDURE checkUser(IN in_email VARCHAR(80), IN in_password VARCHAR(50))
BEGIN
    DECLARE tempId INT DEFAULT 0;
    DECLARE tempName VARCHAR(50) DEFAULT NULL;
    DECLARE done INT DEFAULT 0;

    DECLARE cur CURSOR FOR 
        SELECT id, name FROM users WHERE email = in_email AND password = in_password;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;

    REPEAT
        FETCH cur INTO tempId, tempName;
        UPDATE users SET online = 1 WHERE id = tempId;
    UNTIL done  = 1 END REPEAT;
    CLOSE cur;

    SELECT tempName;
END //
DELIMITER ;

注意: 私はこれをテストしていません。MySQL が現在カーソルを開いているテーブルに対する UPDATE を好まない可能性があります。

PS: パスワードの保存方法を再考する必要があります


RETURNvs. OUTvs. 結果セットについて再コメント:

RETURNストアド プロシージャではなく、ストアド関数でのみ使用されます。ストアド関数は、別の SQL 式内でルーチンを呼び出したい場合に使用されます。

SELECT LCASE( checkUserFunc(?, ?) );

パラメータを使用できますOUTが、最初にそのパラメータとして渡すユーザー変数を宣言する必要があります。とにかく、その値を取得するには、そのユーザー変数を選択する必要があります。

SET @outparam = null;
CALL checkUser(?, ?, @outparam);
SELECT @outparam;

ストアド プロシージャから結果セットを返す場合、SELECTクエリを使用するのが最も簡単です。

于 2009-12-14T20:39:02.377 に答える
2

使用する:

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'

なぜあなたはLIMIT 1あなたのSELECTを持っていますか? 電子メールとパスワードがデータベースに複数回存在することを本当に期待していますか?

于 2009-12-14T20:21:17.020 に答える
0

1 を返す結果が得られた場合は、if ステートメントを試すことができます。あなたのコードを見てみると、true を返すものは何もないように見えるので、リファクタリングする必要があります。メールアドレスが 1 つだけ存在できるクエリ このようなもの

update users set if(result==1,online=1,online=0) where email=emailadress
于 2009-12-14T20:26:44.917 に答える