Utilizzo di SELEZIONARE un gruppo di risultati esecuzione di query di AGGIORNAMENTO con MySQL Stored Procedure

Sto cercando di capire MySQL Stored Procedure, voglio controllare se un utente le credenziali di accesso valido e se è così, aggiornare gli utenti in linea stato:

-- 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 ;

Come posso fare questo se-dichiarazione basata su i gruppi di risultati numero di righe == 1 o id NON È NULL?

OriginaleL’autore tirithen | 2009-12-14

3 Replies
  1. 7
    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 ;

    NB: non ho ancora testato questo. È possibile che MySQL non come UPDATE su una tabella attualmente ha un cursore aperto.

    PS: Si dovrebbe riconsiderare come si memorizza password.


    Re commento su RETURN vs OUT vs set di risultati:

    RETURN è utilizzato solo le funzioni memorizzate, non stored procedure. Le funzioni memorizzate vengono utilizzati quando si desidera chiamare la routine all’interno di un’altra espressione SQL.

    SELECT LCASE( checkUserFunc(?, ?) );

    È possibile utilizzare un OUT parametro, ma è necessario dichiarare una variabile utente prima di passare come parametro. E poi è necessario selezionare l’utente variabile per ottenere il suo valore comunque.

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

    Quando restituisce il set di risultati di una stored procedure, è più semplice utilizzare un SELECT query.

    c’è qualche vantaggio all’utilizzo di SELEZIONARE vs RITORNO o parametri?
    Il primo codice in questa risposta, funziona alla grande come è, grazie per la risposta. Ci è voluto un po ‘ per capire, ma ora ho capito. 🙂 Adesso sto criptare le password del mio (non MD5 e in che modo), tre volte, e due di loro utilizzando diversi sali e l’utilizzo di diverse metodiche di crittografia, quindi il mio pensiero è che sarebbe sufficiente. Tale stringa non mi sembra reale è difficile bruteforce. Queste cose allso sembrava essere riassunto dei link che mi hai dato. C’era qualcosa di altro cui pensare?
    No, se si utilizza una forte funzione di hash e casuale di sale per ogni utente, che dovrebbe essere sufficiente. Ero preoccupato che si erano memorizzare le password in testo normale dal momento che si stava confrontando il in_password per il campo del database con il = operatore. Evviva!

    OriginaleL’autore Bill Karwin

  2. 2

    Uso:

    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'

    Perché avete LIMIT 1 sul vostro SELEZIONARE? Vuoi davvero aspettare un email e la password per il db in più rispetto a una volta?

    Grazie per la veloce risposta e sì, il LIMITE di 1 è inutile, io rimuovere. Una cosa di più, voglio tornare il nome dell’utente (da SELEZIONARE sub-query) di PHP-script. Come posso impostare un “ritorno” variabile o creare un ritorno di risultati del sub-query?
    È possibile utilizzare la clausola di RITORNO, o utilizzare un parametro OUT. Il parametro OUT significa che è fornire un parametro alla query, sarà/deve essere compilato entro & si può usare il parametro in seguito. Ti aggiorna con ulteriori informazioni in seguito, ma per ora vedi: dev.mysql.com/doc/refman/5.0/en/create-procedure.html

    OriginaleL’autore OMG Ponies

  3. 0

    Si potrebbe provare un’istruzione if se si dispone di un risultato che restituisce 1
    ho guardato il tuo codice, sembra che nulla restituisce true in modo che si dispone di rifattorizzare,
    come sopra omg scritto thats davvero vero perché non si dispone di un limite di 1 nella tua query di selezione in cui solo uno emailadress può exisst?
    qualcosa di simile a questo

    update users set if(result==1,online=1,online=0) where email=emailadress

    OriginaleL’autore streetparade

Lascia un commento