Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - 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í.
discount 30 + hiring
Avatar
Martin Suchodol
Tvůrce
Avatar
Martin Suchodol:24.1.2020 10:34

Koněčně jsem se víceméně vysekal z autorizačního systému. A stojí předemnou poslední funkce na zjištění toho zda je uživatel admin. Nejprve kód.

public function isAdmin($userId) {
            return Db::query('
               SELECT MAX(permission_id = 1)
                FROM user_permission
                WHERE user_id = ?
                ', array($userId));
        }

Když kód spustím přímo v databázi, tak funguje dle představ. A vrátí buď 1, když uživatel je admin, a 0 když není. Problém nastává když kód spustím spustím v php. To vrycí vždy true bez ohledu na to zda je nebo není uživatel admin.

Zkusil jsem: Zkoušel jsem i variantu s funkcí IF()

public function isAdmin($userId) {
            return Db::query('
               SELECT IF(MAX(permission_id) = 1, \'True\', \'False\')
                FROM user_permission
                WHERE user_id = ?
                ', array($userId));
        }

Ale zde je problém opačný a výstup je vždy false.

Editováno 24.1.2020 10:36
 
Odpovědět
24.1.2020 10:34
Avatar
Odpovídá na Martin Suchodol
Martin Konečný (pavelco1998):25.1.2020 12:36

Ahoj, nejsem si jistý, ale řekl bych, že metoda Db::query() ti nevrací záznamy z databáze. Nemá to být spíš něco takovýho?

$result = Db::query("SELECT ...");

return $result->fetchRow();

Zároveň ten SELECT samotný se mi zdá divný, jednak bych úplně nespoléhal na to, že permission s ID = 1 bude vždy admin, tzn. v tabulce "user_permission" (nebo jak se nazývá tabulky s právy) bych udělal sloupec třeba "is_admin (0/1)" nebo tak něco, co by to jasně rozlišilo. Nicméně aktuálně bych to napsal asi takhle

SELECT 1 FROM user_permission WHERE user_id = ? AND permission_id = 1

To ti pak vrátí buď "1" a nebo FALSE, pokud to nic nenajde (PDO vrací FALSE, pokud nenajde žádné záznamy). Takže bys to pak mohl jednoduše udělat jako

return (bool) Db::query("
        SELECT 1 FROM user_permission
        WHERE user_id = ? AND permission_id = 1
", array($userId));

Ale znovu říkám, zkontroluj si, co přesně vrací ta metoda Db::query(), podle mě určitě nebude vracet jednu konkrétní hodnotu jednoho sloupce.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
25.1.2020 12:36
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Martin Suchodol
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Martin Suchodol:25.1.2020 14:35

Variantou is_admin, jsem to původně chtěl řešit, ale funkci chci mít univezální. Sice se funkce jmenuje isAdmin(), ale rád bych s její pomocí kontroloval i ostatní oprávnění. Jinak tabulka user_permission, spojuje tabulku user, a tbulku permission. Kdy v druhé jmenované je jasně dané co je jaké oprávěnní - id1 = admin, id2 = user atd.

Jinak kontrolu toho co mi databáze posílá jsem provedl s pomocí print_r. To je v pohodě nebo ne? Pokud ne tak co je ideálnější použít jako kontrolu toho co přitéká?

Každopádně díky, za pomoc tvůj kód funguje, stále se s databází učím takže mě ani nenapadlo že by za selectem mohlo být něco jiného než název sloupce.

 
Nahoru Odpovědět
25.1.2020 14:35
Avatar
Odpovídá na Martin Suchodol
Martin Konečný (pavelco1998):25.1.2020 14:43

A to ID je primární klíč a auto_increment? Jestli jo, tak bych na to osobně raději vážně nespoléhal, že ID = 1 bude vždy admin, ID = 2 bude vždy user apod. :D jelikož je to číslo generované, musel by sis vždycky ohlídat, že to AI bude vždy tou jedničkou začínat.

Podle mě print_r() nebo var_dump() pro jednoduché "debugování" stačí, osobně teda ještě před to přidávám echo "<pre>" a za to exit;, aby se mi vypsalo jen to a ještě úhledně (to dělá to <pre>) :D tzn.

$result = Db::query("...");

echo "<pre>";
var_dump($result);
exit;

ale to spíš když je to třeba nějaké pole, tak to potřebuji vidět úhledně, pokud jen obyč objekt, tak stačí jen to var_dump() / print_r().

V SELECT můžeš mít cokoliv :) tedy i nějakou statickou hodnotu mimo sloupec, výpočet atd.

Nahoru Odpovědět
25.1.2020 14:43
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Martin Suchodol
Tvůrce
Avatar
Martin Suchodol:25.1.2020 14:55

Ano je to tak ID je primátní a auto. Každopádně již dříve jsem přemýšlel že bych to upravil tak aby každé oprávnění mělo dva identifikátory. Takže něco jako:

ID (primar, auto) permission_id permission_name
1 1 admin

S tím že by se jako identifikátor, při propojování by se používalo to druhé ID.

Editováno 25.1.2020 14:56
 
Nahoru Odpovědět
25.1.2020 14:55
Avatar
Odpovídá na Martin Suchodol
Martin Konečný (pavelco1998):25.1.2020 15:06

Podle mě by to bylo takhle lepší :D ID slouží pro jednoznačnou identifikaci záznamu, nepoužíval bych to i k něčemu jinému. Tzn. jestli chceš oprávnění rozdělovat číselně, tak si pro to udělat vlastní sloupec, který bude na ID nezávislý. Jen bych to raději pojmenoval jinak než "permission_id", protože to na první pohled zavání nějakým FK (cizí klíč). Třeba "permission_level" nebo tak něco :)

Nahoru Odpovědět
25.1.2020 15:06
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Martin Suchodol
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Martin Suchodol:25.1.2020 15:25

Tak, to už je pak víceměně na doladění. Zatím neplánuju to co dělám ani prodávat ani používat komerčně. Spíš jsem se rozhodl udělat něco na čem bych se učil, pro ten účel jsem se rozhodl kompletně překopat Davidův framework (kompletní do desáté lekce o eshopu). Už jsme toho udělal relativně dost, ale hodě jsem se sekl na autorizačním systému. Kdy každá stránka má svoje oprávnění a uživateli je na základě těchto oprávnění povolen přístup. Nemalou zásluhu na tom má i relativně malá znalost právě sql a toho jak v něm dělat, což jsem doufal že se naučím práv na autorizačním systému. A také to tak dopadlo, mé znalosti o sql se rozhodně zvýšili a to minimálně o 100%, věci co jsem dřív nechápal mi jsou již jasné, a díky tvojí pomoci vím i že sql může být mnohem pruženější než jsem si doteď myslel.

 
Nahoru Odpovědět
25.1.2020 15:25
Avatar
Odpovídá na Martin Suchodol
Martin Konečný (pavelco1998):25.1.2020 15:36

Je to sice "jen" doladění, ale proč to neudělat rovnou nějak pořádně, než to udělat "nějak" a potom to předělávat :) každopádně na chybách se učíme, v programování zvlášť, takže i to předělávání ti pak pomůže si utřídit myšlenky a postupy nějakých úloh a zadání.

Nahoru Odpovědět
25.1.2020 15:36
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Martin Suchodol
Tvůrce
Avatar
Martin Suchodol:25.1.2020 15:50

Jo to máš, pravdu díky tomu "doladění" jsem už jednou zůstal asi půl dne na jednom místě než mi došlo, že jsem ještě neupravil databázi. Protože jsem si celou dobu stál za tím že chybu mám v php.

 
Nahoru Odpovědět
25.1.2020 15:50
Avatar
Odpovídá na Martin Suchodol
Martin Konečný (pavelco1998):25.1.2020 15:56

To se stane ještě tolikrát, než se to naučíš :D o tom to už holt je.

Nahoru Odpovědět
25.1.2020 15:56
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Martin Suchodol
Tvůrce
Avatar
Martin Suchodol:25.1.2020 16:03

Tak s tím se musí počítat. A mít člověk trpělivost, bez toho by to nešlo :-D

 
Nahoru Odpovědět
25.1.2020 16:03
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 11 zpráv z 11.