Starší komentáře ke článku: Jednoduchá anketa s grafem v PHP a MySQL

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: shark_cz

Datum vložení: 18.3.2009 9:04:08

Sloupce val_1, val_2, val_3... a co když budu chtít v budoucnu přidat fialový tým? Lépe je mít tabulku anket, kde pro ID ankety jsou vyjmenované možnosti a v druhé tabulce hlasovat pomocí ID volby. Což mi připomíná, že jaksi ID ankety v článku chybí úplně a tak je celá tabulka anketa jako jediná anketa. A co cookie protector, které se nastaví, ale nikde nepoužívá? Pokus hezký, ale takovýto článek by zde neměl být.

Avatar

Autor komentáře: Bohumír Bednařík (BoboCop)

Datum vložení: 18.3.2009 10:28:08

Nemyslím si, že by sem článek nepatřil. Článek není o tvorbě nějakého anketního systému, ale o tvorbě jedné ankety. Možná obsahuje nějaké nedostatky. Například mi v článku chybí informace o tom, jak se nastaví šířka divů, protože v CSS kódu je pouze uvedena nevalidní konstrukce width:px. Autor článku patrně zapomněl napsat, že CSS se vytváří dynamicky a že šířku divů je třeba do CSS dodat z vypočítaných hodnot (sice tam jakási taková informace je, ale nikolv uvedena v kódu). Dále se mi nelíbí zbytečné plýtvání řádky kódu. Například pro výpočet procenta osobně používám vzorec: procento = (cast / celek) * 100 s případným zaokrouhlením na potřebný počet desetinných míst. Stačil by tedy pouze jeden řádek na výpočet jedotlivých procent a menší úprava použitého kódu. Šířka divů totiž může být definována v relativních jednotkách (procentech) a měla by se přizpůsobit (podle specifikace) obalovému prvku (formulář, nadřazený div, apod.).

Avatar

Autor komentáře: Miroslav Kucera

Datum vložení: 18.3.2009 10:36:43

Dobry den - dynamicka sirka DIVu se do CSS doplnuje. Pouze jsem pri priprave clanku na vydani opomenul nahradit znak "<" za HTML entitu <, cimz vznikla ona neplatna kontrukce "width:px" - za chvilku to bude opraveno.

Avatar

Autor komentáře: Vojtěch Zíka

Datum vložení: 18.3.2009 11:09:15

Tímto reaguji na Vaše komentáře. Jedná se pouze o jednoduchý funkční nástin ankety s grafem. Vesměs jsou všechny připomínky k omezenosti počtu voleb - anketa by samozřejmě šla vytořit dynamicky, takže by se vytvořil příslušný počet sloupců v db, potřebný počet objektů v css atd. Nicméně to už mi nepřišlo zrovna jednoduché a pro začínající programátory by to bylo značně složité. Co se týká zaokrouhlování - pokud bude například 5 voleb a rozhodnete se je zaokrouhlovat na 2 desetiná místa, tak mi přijde jednodušší deklarovat funkci, ve které pak provedete jednu úpravu, než přepisovat 5 čísel. Výpočet procent - myslím, že je to na každém, jak si to vypočítá - pokud preferujete tento způsob, samozřejmě Vám nic nebrání. Šířka je definována podle procent - jen v kódu nebylo vidět viz komentář M.Kučery.

Avatar

Autor komentáře: Tomáš Andrýsek

Datum vložení: 18.3.2009 11:20:29

Acho jo, cituji: [i]anketa by samozřejmě šla vytořit dynamicky, takže by se vytvořil příslušný počet sloupců v db[/i] Tak přesně tudy cesta nevede ... Pro anketu potřebujete (hrubý popis): Hlavní tabulka: identifikace ankety (PK), anketní otázka, pomocné atributy (od-do, otevřená/zavřená apod) Tabulka odpovědí: idenifikace ankety(FK), identifikace odpovědi (pořadové číslo odpovědi v anketě), odpověď Tabulka hlasování: idenifikace ankety(FK), indetifikace hlasujícího, identifikace odpovědi, pomocné atributy

Avatar

Autor komentáře: Sniper

Datum vložení: 18.3.2009 14:50:04

Takže až budu mít anketu řekněme s 400 položkami, např. "Jaké jméno je vaše oblíbené?" - pokud bych dal český a slovenský jména, tak jich možná bude i víc - tak budu mít tabulku se 402 sloupci a k vybrání dat bude potřeba 400 dotazů. No, pokud by to bylo na trochu vytíženějším projektu (řekněme 5000 pageview denně), tak solidně upečeš databázi. Rozhodně bych u anketní otázky ukládal i počet procent jejich hlasů - jednak ušetříš dotazy a jednak to bude trochu jednodušši. Aktualizaci můžeš řešit na úrovni DB třeba pomocí triggerů (mysql 5 je umí). Btw ošetřovat hlasoval/nehlasoval pomocí blokace IP není správně - wifi provideři ve vesnicích nebo GPRS připojení používá NAT a všichni uživatelé (a tady se bavíme o desítkách nebo stovkách stanic) jde ven přes stejnou IP.

Avatar

Autor komentáře: Tomáš Andrýsek

Datum vložení: 18.3.2009 10:33:56

prosím, jako vzorová aplikace pro absolutního začátečníka možná dobré, ale z programátorského hlediska mizerný návrh ... Uzavřít anketu na 3 možné odpovědi ... anketa může mít 2 až N možností ne?

Avatar

Autor komentáře: Jakub Vrána

Datum vložení: 18.3.2009 11:03:58

Článek je špatně od začátku do konce: 1. Obrat "Po úspěšném připojení k DB v ní musíme vytvořit příslušnou tabulku" naznačuje, že by se tabulka měla vytvářet v PHP skriptu. Na to by skript ale vůbec neměl mít práva, tabulku je vhodné vytvořit mimo aplikaci. 2. Tabulka má nevhodnou strukturu. Jednak dovoluje vytvářet jen ankety s právě třemi odpověďmi (a přidání další odpovědi znamená modifikaci struktury tabulky) a jednak zcela zbytečně používá pro uložení odpovědi tři sloupce - stačil by přeci jeden s identifikátorem odpovědi. 3. Pod jednou IP adresou může vystupovat více uživatelů, je tedy nevhodné ji stanovovat jako primární klíč, protože tím se znemožní hlasování těmto uživatelům. Více o problematice na http://www.root.cz/clanky/php-unikatnost-navstevnika/ 4. Získání počtu odpovědí z databáze zbytečně přenáší všechna data, přitom by stačilo jedno použití funkce COUNT(*). 5. Zápis width:px ve stylu je nevalidní. V textu článku jen chybí PHP kód, který šířku vypisuje (v kódu pro stažení je), i tak je to ale chyba - styl by měl být definován staticky (v externím kešovatelném souboru) a dynamické hodnoty doplněny odděleně. 6. Formulář je HTML nevalidní, protože značku INPUT neuzavírá do blokového elementu. Popisky formulářových políček by navíc měly být obaleny značkou LABEL, která dovoluje odpověď vybrat klepnutím na popis a nejen na malé výběrové políčko. 7. Výpis hodnot v PHP vyžaduje zapnutí konfigurační direktivy short_open_tag, která bývá vypnutá. 8. Skript pro uložení výsledku předpokládá, že SELECT a INSERT se provede atomicky. Ale vzhledem k tomu, že není použita transakce ani zamknutí tabulky, tak to neplatí a uživatel může být při pokusu o opětovné hlasování mylně informován o chybě v systému. 9. Skript je náchylný k podstrčení proměnných způsobujících SQL injection. Konkrétně proměnné $var1-3 se dají při zapnuté direktivě register_globals (která bývá na hostinzích zapnutá z důvodu zpětné kompatibility) podstrčit např. v URL, což může vést k tomu, že útočník vloží jedním požadavkem libovolné množství odpovědí. 10. Informování uživatele o výsledku operace pomocí JavaScriptu vyžaduje zapnutý JavaScript. Zcela chybí neJS varianta. 11. Skript vůbec nepočítá s útokem CSRF - útočník si na svou stránku vloží kód hlasující v anketě a každý návštěvník, který k němu přijde, bude hlasovat tak, jak si útočník přeje. Tím lze anketu manipulovat. 12. Článek vůbec nezmiňuje existenci anonymních proxy serverů a sítě Tor, pomocí kterých může jeden uživatel vystupovat pod značným množství IP adres a tím anketu opět manipulovat. Chápu to jako omyl vydavatele, že článek určený na Apríla omylem vydal dřív. Jde totiž opravdu u jednu z nejhorších implementací ankety.

Avatar

Autor komentáře: Vojtěch Zíka

Datum vložení: 18.3.2009 11:16:38

V tomto příspěvku jsem pouze chtěl navrhnout způsob tvoření samotného grafu. Celé příslušné PHP je co nejjednodušší a slouží pouze k nastínění jak to má fungovat. Je na každém, jak si PHP script upraví. Hlavní ve článku je vytvoření grafu pomocí CSS a relativně definované šířky v závislosti na procentech obdržených hlasů.

Avatar

Autor komentáře: Sniper

Datum vložení: 18.3.2009 14:58:03

Ale to CSS je taky špatně - ve stylopisu nemá PHP co dělat. Když už bys to chtěl řešit pomocí CSS, tak bych do stylopisu dal jenom pozadí a až ve výpisu toho divu bych použil atribut style a tam nastavil šířku (v šablonách php nevadí). A proč vlastně nepoužít obrázky? Ten sloupec může mít od 0 do 100px, tak si prostě vygeneruju 101 gifu se sloupcem a jenom vložím konkrétní obrázek. Ano, znamená to trochu víc dotazů na server, ale zase jakmile si uživatel stáhne obrázky, další požadavky už si je berou z cache prohlížeče. btw zmiňovat se o oddělení prezentace a logiky moc smysl nemá, ale i tak - sql a html nepatři do stejnýho souboru.

Avatar

Autor komentáře: Miroslav Kucera

Datum vložení: 18.3.2009 18:01:05

Dobry den. Nejsem sice programator, ale absolutne nevidim rozdil mezi tim, kdyz vlozite nejaky PHP kod do CSS kodu a do HTML kodu. Z pohledu prohlizece je to uplne totez - dostane stranku, ktera nebude obsahovat zadny PHP kod. Abych navazal na vas prispevek - je prece uplne jedno, jestli vlozite nejakou PHP znacku do atributu style, nebo primo do CSS definice ve znacce style ve stejnem souboru.

Avatar

Autor komentáře: Tomáš Andrýsek

Datum vložení: 19.3.2009 8:39:54

Ahoj Mirku, správné řešní je CSSko v souboru a vlastní definice délky jako inline styl, nebo vložený styl do stránky. Jenom to co je dynamické se musí nastavovat při každém zobrazení stránky, jinak z cache prohlížeče ...

Avatar

Autor komentáře: Sniper

Datum vložení: 19.3.2009 10:56:02

Neni - pokud je css soubor nemenny, prohlizec si ho muze ulozit do cache a nemusi s tim otravovat server.

Avatar

Autor komentáře: Miroslav Kucera

Datum vložení: 19.3.2009 11:20:43

Jenze v tomto pripade je CSS na stejne strance jako kod PHP. Tj. stranka se bude muset vygenerovat vzdy znova, takze osobne nevidim nic spatneho vkladat pomoci PHP velikost do CSS. Samozrejme - tohle je naprosta prkotina v porovnani s ostatnimi pripomikami :)

Avatar

Autor komentáře: bahara

Datum vložení: 20.3.2009 17:10:02

snažej se ti říci Mirku, že i v takovýchto "lehkých" příkladech by se mělo dbát na základy. A k tomu i využití cachovaní patří. To že se bude načítat jen stránka s php/html a už ne s css tady nepoznáš, ale při větším projektu je to sakra znát.

Avatar

Autor komentáře: Juraj Krivda

Datum vložení: 18.3.2009 11:56:32

Autor nedomyslel situáciu keď si stránku zobrazím bez zapnutých CSS.

Avatar

Autor komentáře: JimX

Datum vložení: 18.3.2009 17:34:53

Taky to bude tak trochu nechodit, pokud jeste nekdo nestihl hlasovat. To pak bude $suma = 0 (tudiz i $perc) a nulou umi delit jenom Jara Cimrman (nebo to byl Chuck Noris?)

Avatar

Autor komentáře: trife

Datum vložení: 19.3.2009 21:14:48

tam se prece nulou nedeli

Avatar

Autor komentáře: JimX

Datum vložení: 19.3.2009 22:33:45

opravdu? mne prijde, ze ano: $suma = $value_1 + $value_2 + $value_3; # 0+0+0 = 0 $perc = $suma / 100; # 0/100 = 0 $graf_1 = $value_1 / $perc; # 0/0 = !!! ... normalne bych si toho asi nevsiml, ale uz jsem par grafu do anket programoval a parkrat uz jsem na tuhle chybu u sebe narazil a proto jsem si toho vsiml i tady :)

Avatar

Autor komentáře: Standa

Datum vložení: 12.5.2009 21:04:27

Bohužel to nechodí... dělení nulou, kd emi to psalo chybu jsem opravil, ale upozorňuje mě to na 15 řádek: $value_1 = mysql_num_rows($vysledek); Já se v programování skoro vůbec nevyznám, mohl bych tedy vědět co by se mělo a jak opravit?

Avatar

Autor komentáře: Samuel Devero

Datum vložení: 14.5.2009 20:32:19

Tak jsem si přečetl článek i komentáře. Děkuju autorovi za ukázku tvoření anket, myslím že leckoho, včetně mně, může inspirovat. Myslím že nejde o to publikovat zde dokonalý kód který si každý může jen nakopírovat na stránky ale jde zde o publikování názoru, možností. A to mi tento článek dal.

Avatar

Autor komentáře: Václav Pavlín

Datum vložení: 15.5.2009 17:20:10

Souhlasím s pisatelem nade mnou, že nejde o to publikovat dokonalý kód, který si každý zkopíruje a použije. Na druhou stranu jde o to, aby to programátorům (v tomto případě hlavně začátečníkům) dalo návod, jak něco udělat správně, což podle mého názoru tento článek neřeší. Již zmíňený inline CSS zápis, který jsou v tomto případě vhodnější, nebo dělení nulou. Vzpomínám si, co všechno jsem dělal, když jsem začínal a špatných návyků se zbavuje těžko, takže by pravděpodobně bylo lepší publikovat dokonalý kód, aby dal začátečníkům jasnou představu o tom, jak je to správně. Jinak nápad s CSS grafem je dobrý, i když pozbývá význam při vypnutých stylech, proto se také přikláním spíš k využívání obrázků, ale co když někdo vypne obrázky...začarovaný kruh:-) Na závěr - každý článek o PHP je dobrý, pokud si čtenář přečte komentáře;-)

Avatar

Autor komentáře: neron

Datum vložení: 16.5.2009 12:01:40

Neni sporu o tom, ze v tomhle clanku je vsechno spatne. Neni mozne to brat tak, ze je to jednoduchy skript pro jednoduchou anketu, protoze obsahuje chyby ale hlavne je dokonalou ukazkou reseni "tak tahle tedy ne". Vsechno co se tomu dalo vytknout uz tu bylo receno, at uz jde o navrh databaze a nebo praci s DB jako takovou. Jenze - vsadim svuj zitrejsi obed, ze autori vsech tech chytrych komentaru kdysi davno napsali neco podobneho, mozna mnohem horsiho. Kazdy nejak zacina, kazdy se uci. Co mi prijde daleko horsi je to, ze zdejsi redakce neco takoveho nechala zverejnit a dokonce uz to tu vydrzelo 2 mesice, takze se tim (buh chran) muzou inspirovat dalsi...

Avatar

Autor komentáře: ll

Datum vložení: 18.5.2009 0:44:52

Mno, vzhledem k frekvenci publikování článků o PHP se asi není čemu divit. (Mýlím se, nebo byl předešlý článek publikován téměř před rokem?)

Avatar

Autor komentáře: Vanda

Datum vložení: 29.5.2009 14:58:11

Začínám se učit php, a tak jak jsem se učila html a css na příkladech, tak postupuji i teď a dívám se, jak a co kde funguje. Tady jsem zajásala, ale po přečtení příspěvků v diskusi jsem zklamaná (i ze zbytečně vytištěného článku...) - je to pro mne ale poučení pro příště.

Zpět na článek | Úvodní stránka Interval.cz