Minule jsme si popsali vlastnosti kvízu, skripty z nichž se kvíz skládá
a ukázali jak pracuje skript pro vypsání formuláře kvízu. Dnes se podíváme
na skript vyhodnoceni.php, jenž má dvě základní funkce:
- zobrazení výsledků kvízu
- zapsání statistik kvízu a výsledků konkrétního kvízu do CSV
(souboru se středníky oddělenými hodnotami) souboru
Vzhledem k tomu, že po dokončení kvízu se soutěžícímu zobrazí správné
odpovědi, měli bychom zabránit, aby v případě, že se vyskytne nějaký
nepoctivec (který by si kvíz zopakoval již se znalostí správných odpovědí),
došlo tímto nepoctivcem ke zkreslení našich statistik. Je třeba zajistit,
aby nepoctivec sice mohl kvíz zkusit znovu, ovšem jeho "úspěch"
byl ignorován. Nejjednodušší metodou je použití cookies, tedy poznamenat
si na počítač, z nějž již byl kvíz odeslán, že se tak stalo a to kdy. Já
jsem pro svůj kvíz nastavil dobu platnosti cookie na 30 dnů. Tedy po 30 dnů
od prvního odeslání kvízu daným uživatelem z konkrétního počítače se
budou výsledky kvízu pro účel zapsání do výsledků a statistik ignorovat.
Je pravděpodobné, že obsah kvízu jednou za čas obměníme. Proto je třeba
si do cookies zapsat i nějaké označení verze kvízu a v případě, že sice
uživatel odeslal kvíz před méně než třiceti dny, ale jednalo se o jinou
verzi kvízu, je třeba jeho výsledek v kvízu neignorovat.
|
vyhodnoceni.php - 1. část
|
<?
$cislokvizu="1"; //zde je nastavena aktuální verze kvízu
$doba=(3600*24*30); //30 dní
if (IsSet($kviz_verze) AND ($cislokvizu==$kviz_verze)):
//porovnání zda verze kvízu přečtená z cookie je shodná s aktuální verzí kvízu
$reload=1;
else: //kvíz je odeslán poprvé
SetCookie("kviz_verze", $cislokvizu, (Time()+$doba));
//zapsání do cookies do $kviz_verze identifikace verze přečtené z $cislokvizu
$reload=0;
endif;
?>
<html>
<head>
<title>Vyhodnocení</title>
</head>
<body>
<p>VYHODNOCENÍ</p><br>
<?
require "./data.php";
$zapisot="";
$spravnychodpovedi=0;
$krok=1;
$arr_sprodp=$pocetmoznosti+1;
while($krok<=$pocetotazek):
//zda jsem dostal nějakou odpověď
if (empty(${"a".$krok}) ):
${"a".$krok}="nevyplneno";
endif;
echo "<table border=\"0\" width=\"100%\"><tr><td width=\"20%\">";
echo "Otázka ".$krok.".:<br>";
if (${"a".$krok}==${"q".$krok}[$arr_sprodp]):
//odpověď byla správná
echo "Správně!<br>";
echo "</td><td width=\"70%\">";
echo "<b>Otázka zněla:</b> ".${"q".$krok}[0];
echo "<br><b>Vaše správná odpověď byla:</b> "
.${"q".$krok}[${"q".$krok}[$arr_sprodp]];
$spravnychodpovedi++; //pocitani spravnych odpovedi
$zapisot.="1"; //zápis konkrétní správné odp.
echo "</td></tr></table>";
else:
//odpověď byla špatná, žádná či nerelevantní
echo "Špatně!<br>";
echo "</td><td width=\"70%\">";
echo "<b>Otázka zněla:</b> ".${"q".$krok}[0];
echo "<br><b>Správná odpověď je:</b> "
.${"q".$krok}[${"q".$krok}[$arr_sprodp]];
if (Is_Int(${"a".$krok}*1) && ${"a".$krok}>=1 && ${"a".$krok}<=$pocetmoznosti ):
//odpověď je relevantní
echo "<br><b>Vaše odpověď byla:</b> ".${"q".$krok}[${"a".$krok}];
else:
//odpověď nebyla žádná či irelevantní
echo "<br><b><i>Na tuto otázku jste vůbec neodpověděl(a).</i></b>";
endif;
$zapisot.="0"; //zápis konkrétní špatné odp.
echo "</td></tr></table>";
endif;
echo "<hr noshade>";
$krok++;
endwhile;
$score=Round($spravnychodpovedi/$pocetotazek*100);
echo "<b>SOUHRNNÉ VYHODNOCENÍ:</b><br>";
echo "Z celkových <b>".$pocetotazek."</b> otázek jste zodpověděl(a) správně <b>"
.$spravnychodpovedi."</b>.<br>Vaše úspěšnost v kvízu je tedy <b>".$score."%</b>.";
?>
|
První část PHP kódu zjistí, zda byl kvíz odeslán poprvé (a v tom případě
učiní zápis do cookies) a nastaví proměnnou $reload na 0 (pokud je
kvíz odeslán poprvé) či 1 (pokud již z cookies bylo zjištěno, že kvíz
byl během posledních 30ti dnů odeslán).
V druhé části PHP kódu se nejdříve vloží soubor data.php (viz
minulý článek). Jsou inicializovány proměnné
- $zapisot (za každou otázku se do řetězce $zapisot připíše
"0" či "1", máme-li 3 otázky výsledný $zapisot tedy
bude "000" nebo "001" nebo "010"... a dalších
5 kombinací)
- $spravnychodpovedi (za každou správnou odpověď se inkrementuje
o 1)
- $krok (inkrementuje se každým projetím cyklu pro zobrazování
správnosti odpovědi na otázku)
- $arr_sprodp (udává index prvku pole, kde můžeme najít
informaci o správné odpovědi - resp. index prvku se správnou odpovědí)
Následuje cyklus, který vypisuje číslo otázky, text "Správně!"
či "Špatně!", text otázky. Dále v případě, že byla odpověď
správná zobrazí tuto odpověď, inkrementuje se $spravnychodpovedi a
do řetězce $zapisot přípíše "1". V případě, že byla
vybrána jiná než správná odpověď, vypíše se vybraná odpověď a správná
odpověď a do řetězce $zapisot přípíše "0". V případě,
že nebyla vybrána žádná odpověď, vypíše se informace, že nebyla vybrána
žádná odpověď a správná odpověď a do řetězce $zapisot připíše
opět "0".
Nakonec se vypíše souhrnné hodnocení kvízu, kde se úspěšnost spočítá
z celkového počtu (zadáno v data.php) otázek a počtu správných odpovědí.
|
vyhodnoceni.php - 2. část
|
<?
if (!$reload):
//STATISTIKY:
$datum = Date("d. m. Y");
$cas = Date("H:i:s");
if (File_Exists("statistiky.txt")):
$fp = FOpen ("statistiky.txt","r");
$data = FRead ($fp, FileSize("statistiky.txt"));
FClose($fp);
$arr_stat=Explode(";", $data);
else:
$arr_stat[0]=0;
$arr_stat[1]=0;
$arr_stat[2]=$score;
$arr_stat[3]=$score;
endif;
$arr_stat[0]++; //počet lidí
$arr_stat[1]=Round(((($arr_stat[1]*($arr_stat[0]-1))+$score)/$arr_stat[0]), 2);
//prům. score na 2 des. mista
if ($score<$arr_stat[2])://minimum
$arr_stat[2]=$score;
endif;
if ($score>$arr_stat[3])://maximum
$arr_stat[3]=$score;
endif;
$arr_stat[4]=$datum." v ".$cas; //datum/čas dokončení kvízu
$write=Implode($arr_stat, ";");
$fp = FOpen("statistiky.txt", "w");
FWrite ($fp, $write);
FClose ($fp);
//ZÁPIS VÝSLEDKŮ ZA KAŽDÉHO KVÍZUJÍCÍHO
$datum = Date("Y-m-d");
$pcjmeno = (gethostbyaddr($REMOTE_ADDR));
$pcip = (gethostbyname($REMOTE_ADDR));
$write=$datum.";".$cas.";".$pocetotazek.";".$spravnychodpovedi.";"
.$zapisot.";".$pcjmeno.";".$pcip."\n";
$fp = FOpen("vysledky.txt", "a");
FWrite ($fp, $write);
FClose ($fp);;
endif;
?>
<br>
</body>
</html>
|
Celý výše uvedený PHP kód se provede za předpokladu, že se jedná o
první uskutečnění kvízu soutěžícím a tudíž $reload==0. Do
souboru statistiky.txt se vždy zapíše aktuální informace o počtu
uskutečněných (odeslaných) kvízů, průměr výsledků těchto kvízů s přesností
na 2 desetinná čísla, nejhorší a nejlepší výsledek kvízu a jako poslední
údaj je zapsáno kdy byl dokončen poslední kvíz. Takto zapsané informace
lze následně libovolným PHP skriptem ze souboru přečíst, funkcí Explode(";",
$data_ze_souboru) načíst jednotlivé informace do pole a dále je například
zobrazit či jinak zpracovat (pozn. do $data_ze_souboru musí být předtím
načten obsah souboru). Do souboru vysledky.txt se za každý odeslaný
kvíz zapíše jeden řádek údajů, které jsou opět odděleny středníkem. Zapsáno
je datum (ve formátu YYYY-MM-DD), čas, celkový počet otázek, počet
správně zodpovězených otázek, "řetězec nul a jedniček"
identifikující úspěch či neúspěch u každé otázky a na konec též doménová
a IP adresa počítače odesilatele kvízu. Takto CSV formátovaný soubor je následně
možno zpracovat jiným skriptem či třeba snadno importovat do Excelu a získané
údaje analyzovat zde.
Výše uvedený kód produkuje graficky velmi strohý kvíz, není jistě
problém jej zkrášlit troškou kaskádových stylů. To je ovšem mimo téma
tohoto článku. Na graficky trošku hezčí podobu se můžete podívat například
na stránky (do sekce Kvíz),
pro něž jsem původně kvíz vytvořil. Kompletní zdrojové kódy si můžete
stáhnout v ZIPu zde.
Pecka Miroslav
|