Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

Dobrý den, řeším takový problém s funkcemi. Z toho, co jsem vyčetl, jsem vyrozuměl že funkce definovaná jako Deterministic vrací při stejných parametrech stejný výsledek. Což u mojí funkci neplatí protože se spoléhá na funkci now(), a tudíš bych ji potřeboval definovat tak, aby nevracena stejne vysledky. Bojím se hlavně u ukládání do cashe.
Nebo je to špatně a blbě jsem to pochopil? Protože nondeterministic funkce mi definovat nejde.
Děkuji za odpověd

Odpovědět 17.10.2013 20:58
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Kit
Redaktor
Avatar
Odpovídá na patrik.valkovic
Kit:

Funkce je buď standardní, anebo "DETERMINISTIC". Pokud obsahuje funkci NOW(), tak tam to klíčové slovo nedávej, bude nadefinována jako standardní, tedy nedeterministická.

Nahoru Odpovědět 17.10.2013 21:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na patrik.valkovic
Kit:

V manuálu je doslova:
the default is NOT DETERMINISTIC

Nahoru Odpovědět 17.10.2013 21:13
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

Jenže mě právě nejde vytvořit not deterministic funkce. Vypíše mi to Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_fun­ction_creators variable)

Přidávám tu funkci, i když si myslím že v ní to nebude

DELIMITER //
CREATE FUNCTION dokonceniRegistrace(hashKod CHAR(32))
RETURNS VARCHAR(10)
BEGIN
        DECLARE IDuzivatele INT;
        SELECT userID INTO IDuzivatele FROM completeregister WHERE registerHack = hashKod;
        IF userID IS NULL THEN RETURN 'Failure'; END IF;
        DELETE FROM completeregister WHERE userID=IDuzivatele;
        UPDATE users SET activated=1 WHERE id=IDuzivatele;
        RETURN 'Success';
END//
Delimiter ;
Nahoru Odpovědět 17.10.2013 21:28
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Kit
Redaktor
Avatar
Odpovídá na patrik.valkovic
Kit:

Proč to děláš tak složitě? Vždyť to jde jedním dotazem

UPDATE users SET activated=1
    WHERE id=IDuzivatele AND registerHack = hashKod;

Podle počtu ovlivněných záznamů (0 nebo 1) poznáš, zda se registrace povedla nebo ne.

Nahoru Odpovědět 17.10.2013 21:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na patrik.valkovic
Kit:

Aha, ty to máš ve dvou tabulkách. Tak drobná oprava:

UPDATE users SET activated=1 WHERE id IN (
    SELECT userID FROM completeregister WHERE registerHack = hashKod
);

Stejně si myslím, že by místo tabulky completeregister v databázi měl být pouze záznam v SESSION.

Nahoru Odpovědět 17.10.2013 21:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

No to je pravda, ale stále to neřeší problém u jiných funkcí, kde mi nejde vytvořit NOT DETERMINISTIC funkce. A poněvadž pokaždé generuji jiné MD5 z NOW() tak pokaždé funkce vrací jiný řetězec.

Editováno 17.10.2013 22:08
Nahoru Odpovědět 17.10.2013 22:07
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Kit
Redaktor
Avatar
Odpovídá na patrik.valkovic
Kit:

Tak výsledek funkce NOW() té své funkci předej přes DI jako další parametr.

Nahoru Odpovědět  +1 17.10.2013 22:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

Jo, to je dobrý nápad, sice to není ideální, ale aspoň bude zaručen správnost výsledku. Jinak funkci mám z důvodu, že volám delete i update a nechci odesílat 2x požadavek.

Editováno 17.10.2013 22:26
Nahoru Odpovědět 17.10.2013 22:25
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.