Hodnocení doplňků, článků

Diskuze k Romikovým stránkám, věnovaným převevším Dračímu doupěti +;
Uživatelský avatar
zrzavec
Romikovec
Příspěvky: 3671
Registrován: 20. 7. 2006, 17:23
Bydliště: Plzeň
Kontaktovat uživatele:

Hodnocení doplňků, článků

Příspěvek od zrzavec » 10. 8. 2007, 07:01

Toto téma se asi především bude týkat dvou lidí a jimi jsou: Wan-To a Jackee Lee. Proč? Protož oni mi vždy poradili co a jak s web kodem.

Pánové, dnes bych na vás měl dotaz, který jsme již v minulosti promýšlel. Teď už jedou stránky z části na php a proto by mě zajímlo, jestli jě nějaká jednoduchá skulinka (jako u menu), jak přidat hodnocení ke článkům, doplňkům a podobně. Zatím to řeším anketami, ale to není tak elegantní.

Kdybystem i mohli poradit (kdokoliv), jak by mohl tkaový kousek kodu vypadat (pokud to není nějaké extrémně složité). Byl bych rád a zase bych své dítko o trošičku vylepšil :-D
Hraji a vedu: DnD 4e - Naše stránky

Dříve RomiK, nyní Zrzavec :)

Uživatelský avatar
Wan-To
Rebel
Příspěvky: 2967
Registrován: 2. 8. 2006, 17:33
Bydliště: Praha

Příspěvek od Wan-To » 10. 8. 2007, 11:51

Tady bohužel žádný jednoduchý způsob neexistuje. Oproti menu je tu totiž jedna věc navíc - zápis dat. U menu, i když ho vkládáš dynamicky pomocí PHP, nikam nezapisuješ - jeho obsah je pořád stejný, takže soubor s menu používá jen pro čtení.

Zápis dat s sebou přináší několik věcí, které je potřeba vyřešit:
- úložiště dat
- formát dat (datová struktura)
- předávání dat PHP skriptu
- atomičnost zápisu a čtení
- samotné čtení a zápis

A pak je potřeba vyřešit jeden problém specifický pro tuhle záležitost - zajistit nějak, aby jeden člověk nemohl hodnotit článek víckrát.

Úložiště dat
Dají se použít buď běžné soubory (textové nebo binární) anebo databáze. Se zápisem do souborů je většinou spoustu problémů, takže se v praxi používá jen databáze a soubory právě pro takové součásti webů a aplikací, jakými jsou různá menu, hlavičky a patičky stránek, protože tam není potřeba zapisovat; stačí číst.

Formát dat
U soborů si můžeš vymyslet cokoliv, ale soubory nepoužívej. :wink: Každopádně stejně uvedu příklad. Abys mohl ukládat hodnocení článků (nebo čehokoliv obecně), potřebuješ pro každý článek dva údaje: celkový součet všech hodnocení a nějaké číslo, které bude udávat, kolikrát byl článek hodnocený. Obsah souboru s hodnocením by pak mohl vypadat asi takhle:

Kód: Vybrat vše

clanek1.html: 5/2
clanek2.html: 8/7
clanek3.html: 1/1
Číslo za lomítkem udává, kolikrát byl článek hodnocený. Výslednou známku spočítáš jako podíl toho prvního a druhého čísla, takže třeba první článek (soubor clanek1.html) by dostal známku 2.5.

U databáze je situace trochu jiná. Paradoxně, ač to vypadá ze začátku složitěji, je používání databáze mnohem jednodušší. V databázi se data organizují do tabulek, přičemž každá tabulka má pevně daný seznam sloupců a záznamy se do ní vkládají po řádcích. No prostě úplně běžná tabulka jako třeba na papíře. :D K jednotlivým sloupcům se dají ještě přidávat různé modifikátory, např. unique - říká, ve všech záznamech tabulky nesmí existovat dvě stejné hodnoty pro určitý sloupec.

Tabulka pro hodnocení by vypadala nějak takhle:

Kód: Vybrat vše

+-----------------+-----------+-----------------+
| soubor          | hodnoceni | pocet_hodnoceni |
+-----------------+-----------+-----------------+
| clanek1.html    |         5 |               2 |
| clanek1.html    |         8 |               7 |
| clanek1.html    |         1 |               1 |
+-----------------+-----------+-----------------+
Databázový server, kde jsou data uložená, se sám stará o jejich strukturu v souborech i o čtení a zápis. Jen mu říkáš, co chceš dělat a jak budou vypadat tabulky; jak se to bude dělat, je už na něm (a proto je ve výsledku databáze lepší volba).

Předávání dat PHP skriptu
Nějak musíš skriptu, který se bude o hodnocení starat, říct, jaký článek se hodnotí a jaká je známka. Tohle se dělá pomocí proměnných HTTP požadavku. HTTP protokol funguje tak, že prohlížeč si požádá o nějakou stránku a server mu jí naservíruje. :D Jedinou možností, jak serveru předat nějaká dynamická data, je strčit je nějak šikovně do adresy stránky nebo je propašovat přímo do HTTP požadavku.

Když se data strkají do adresy, říká se jim GET proměnné. Jsou to ty nesrozumitelné bláboly za otazníkem (?) v každé druhé adrese na webu. I tady na fóru.

POST data jsou schovaná uvnitř HTTP požadavku. O jejich posílání se stará prohlížeč a v adrese vidět nejsou. Používají se všude tam, kde je potřeba odesílat nějaká delší data (třeba vkládání příspěvků na tady fórum), protože kapacita GET proměnných je omezená, a tam, kde nesmí být data vidět v adrese (přihlašování - bylo by vidět heslo).

POST proměnné jdou odesílat jen pomocí formulářů, oproti tomu GET se dají strčit kamkoliv - třeba do odkazu.

Atomičnost zápisu a čtení
je hnusná věc... Určitě se někdy stane, že na stránky přijdou dva lidé současně. Jeden bude hodnotit článek (zápis) a druhý si bude prohlížet jeho hodnocení (čtení). Tady může nastat kolize (bang! $D) - v průběhu zápisu se data většinou dostanou do nekonzistentní podoby (třeba ještě nebude aktualizovaný celý soubor). A když bude někdo jiný v tuhle chvíli data číst, nejspíš dostane špatné výsledky. Ještě větší průser nastane v případě, že budou zapisovat dva lidé současně. To se taky může stát, že přijdeš o veškeré dosavadní hodnocení článků.

Řeší se to tak, že program se před prací s daty podívá, jestli s nimi někdo nemanipuluje. Pokud ano, počká, až ten druhý práci dokončí. Tomu se říká atomičnost.

V případě souborů se jí dosahuje jejich zamykáním. Jsou s tím jen problémy a hlavně PHP má zamykání implementované naprosto impotentně, takže se všechno musí různě obcházet a přestože atomičnost souborů v PHP řešitelná je, je řešitelná hodně blbě.

U databáze je situace úplně jednoduchá. O atomičnost se stará databázový server. Díky tomu odpadá spoustu problémů.

Samotné čtení a zápis
U souborů se používají různé funkce, které umí zjišťovat data uvnitř, přepisovat je, přidávat další apod. Běžně se používají fopen (otevře soubor), fread (čte z něj), fwrite nebo fputs (zapisuje) a fclose (zavře soubor).

U databáze se pomocí jazyka SQL říká, co má databázový server dělat. Třeba "SELECT * FROM hodnoceni" vybere všechny řádky se záznamy všech sloupců a předá je PHP skriptu. Vypadá to složitě, složité to je, ale je to jednodušší, než používat funkce pro manipulaci se soubory.

Ochrana proti vícenásobnému hodnocení článků
Tohle je neřešitelný problém. Ty totiž nemůžeš nijak jako majitel serveru zjistit, kdo sedí u klientského počítače, abys určil, jestli ten člověk už nehlasoval. Ale ty nemůžeš ani jednoznačně identifikovat nějaký počítač, když se rozhodneš omezit se místo lidí jen na počítače. Naštěstí byl vymyšlený způsob, jak alespoň dočasně rozpoznat unikátní instalaci nějakého prohlížeče. Server má možnost dát prohlížeči cookie (koláček), čímž si určitý prohlížeč "ocejchuje". Pokud je prohlížeč poslušný, tak všechny své koláčky při další návštěvě serveru ukáže, a tak server pozná, jestli se už z nějakého prohlížeče hlasovalo nebo ne.

Snad všechny prohlížeče naštěstí poslušné jsou. Bohužel, jsou tu neposlušní uživatelé, kteří umí vyrábět neposlušné prohlížeče. :roll: Takže je tu riziko, že někdo kontrolu vícenásobného hlasování obejde. To riziko je sice malé (proč by to taky někdo dělal), ale je tu.


Jen tohle pitomé hodnocení článků je zatraceně složité. Naučit se to (a zároveň tomu plně porozumět) je práce tak na rok. Potřebuješ znát dobře PHP, SQL a základy HTTP protokolu. Takže jestli chceš, zkusím si najít hodinu času a napíšu to. Nemělo by mi to zabrat víc než tu hodinu.

Uff. 5 kilometrů. Ani Markus na mě nemá. $D :roll:


PS: Koukám, že máš nového avatara. $D

Zamčeno

Zpět na „Stránky RomiKovy družiny“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host