Diskuze: Vypsání uživatele s rolí a následné vyfiltrování dalších uživatelů
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Nebylo by lepší vytahovat z databáze vytahovat pouze to co chceš? Tím myslím:
SELECT * FROM users WHERE role='b'
A poté už to jen vypsat a v PHP nic neřešit.
Něco málo od problému, nepoužívej mysql_query ale použij nějaký ovladač (pdo, mysqli, z mé zkušenosti doporučuji pdo) kde bys měl vyřešený určitý věci (sql injection..) a mohl bys vše dělat jednoduše. Například v PDO dotaz vypadá takto:
$dotaz = $pdo->prepare("SELECT jmeno, prijmeni FROM uzivatele WHERE id = ?");
$vysledek = $dotaz->execute(array($idUzivatele));
Neaktivní uživatel bohužel v databázi jsou role uložené takto
serialize(Array('a','b','c'));
tabulka pak vypadá nějak takto
| id | username | roles |
| 1 | Jan | array(A, B, C) |
| 2 | Jana | array(B, D) |
| 3 | Pavel | array(B) |
| 4 | Karel | array(A, C, D) |
A já potřebuji vypsat jen toho co má roli B, ale nemá roli A (ostatní role mě nezajímají) což jsou Jana a Pavel, takže toto
SELECT * FROM users WHERE role='b'
nefunguje...
Ale děkuji.
Jinak děkuji za doporučení PDO (abych pravdu řekl ani to neznám) bohužel pro mě v současné chvíli nemá smysl to měnit, celí web je už udělaný přes mysql_query, ale do budoucna určitě vyzkouším.
To mas uplne blbe.
Pokud tech roli nemas moc, tak se pouziva sql typ SET nebo tabulka, nikoliv
STRING.
https://dev.mysql.com/…/en/set.html
Pokud tam mas string, pak musis vedet, jak serialize zapisuje data a pak bys
nejspis pro vyhledavani pouzil LIKE
https://dev.mysql.com/…atching.html
https://www.tutorialspoint.com/…e-clause.htm
WHERE a LIKE '%b%'
No, a normalni clovek by pouzil extra tabulku a join, group by group_concat, treba.
role
1, a
2, b
3, c
uzivatele
1, tomas
2, jan
role_uzivatel (id_uzivatel, id_role)
1, 1
1, 2
SELECT
c.name_uzivatel,
b.name_role
FROM
role_uzivatel a
LEFT JOIN role b ON b.id_role=a.id_role
LEFT JOIN uzivatel c ON a.id_uzivatel=b.id_uzivatel
WHERE b.name_role='b'
Máš zle navrhnutú databázu a tak sa aj pokúšaš naprosto nevhodným spôsobom zisťovať role užívateľa.
Riešenie je, že tie roles nebudeš mať v tabuľke users. Ten stĺpec odtiaľ treba vymazať. Tabuľka ostane vyzerať zhruba takto:
| id | username |
| 1 | Jan |
| 2 | Jana |
| 3 | Pavel |
| 4 | Karel |
Následne založíš tabuľku roles v ktorej budú stĺpce ID a ROLE. A tam vložíš všetky role ktoré potrebuješ. Napríklad:
| id | role |
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
A budeš potrebovať tabuľku, nazvi ju napríklad users_roles, v ktorej bude povedané ktorý užívateľ má pridelené ktoré práva. Napríklad užívateľ mal práva A, B, C a tak tam dáš tri riadky s id užívateľa a id príslušných práv. Rovnako pre ostatných troch užívateľov.
| userid | roleid |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 2 | 4 |
| 3 | 2 |
| 4 | 1 |
| 4 | 3 |
| 4 | 4 |
Hotovo. Odteraz nepotrebuješ ten while cyklus a keď chceš vypísať len užívateľov s právom B, SQL príkaz ako tento ti rovno vráti príslušných užívateľov:
SELECT u.*
FROM users u
JOIN users_roles ur ON u.id = ur.userid
JOIN roles r ON ur.roleid = r.id
WHERE r.roleid = 2
Takto sa to robí v praxi. Užívateľov máš zvlášť, role máš zvlášť, a v "medzitabuľke" users_roles si udržuješ vzťah medzi users a ich roles. Takže keď chceš napríklad užívateľovi Pavel pridať aj právo C, všetko čo musíš urobiť je toto:
INSERT INTO users_roles VALUES (3, 3)
Čiže užívateľovi s id 3 (Pavel) pridáš právo s id 3 (C)...
Ak Ti to celé ešte stále nedáva zmysel, tak predbiehaš udalosti a nemal by si to ani len skúšať urobiť, ale mal by si miesto toho ísť na kurz MySQL, pretože tu chýbajú úplne základné znalosti z tvorby databáz.
PS: Dátový typ SET sa ani nepokúšaj použiť, ide proti normálovým pravidlám.
Zobrazeno 5 zpráv z 5.
