Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Patrik Valkovič:17.10.2013 20:58

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
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Kit:17.10.2013 21:05

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
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Kit:17.10.2013 21:13

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 Valkovič:17.10.2013 21:28

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
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Kit:17.10.2013 21:38

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
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Kit:17.10.2013 21:56

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 Valkovič:17.10.2013 22:07

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
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Kit:17.10.2013 22:12

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

Nahoru Odpovědět
17.10.2013 22:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Patrik Valkovič:17.10.2013 22:25

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.