Grafika publishing webtip.cz grafika.cz mujiPod.cz mujmac.cz fotografovani.cz printing.cz builder.cz galerie
webtip.cz
adresář  | práce  | diskuse  | redakce  | inzerce
 
 


  Kvíz v PHP (2)
o autorovi 
poslat mailem 
tisknout článek 
aktuální rubrika 
Pokračování návodu, kterak si vytvořit v PHP vlastní kvíz. Dnes se podíváme na tvorbu vyhodnocení kvízu a zápis statistik.

Pecka Miroslav - 02.04.2003 - tutorial - Rubrika: PHP

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


Hodnocení článku: -1- -2- -3- -4- -5-  Aktuální hodnocení: 2.61 (3999)

Relevantní články
Žádné články


Příspěvky do diskuse o aktuálním článku
Honza25.03.23:49Ukradené ...
Filip03.12.13:14snad mi to niekedy bude jasne a dostanem sa do toho
  

 

  O vydavateli | Kontakt | Ceník reklamy | Ochrana osobních dat
©2002 Grafika Publishing. Všechna práva vyhrazena!