Online webtest v PHP bez použití databáze

8. září 2002

Pro zpestření stránek, ale i třeba jako určité lákadlo na naše služby (různé vzdělávací kursy apod.), kdy návštěvníkovi stránek ukážeme, že to s jeho znalostmi není až takové, jaké by mohlo nebo mělo být, poslouží online test. Klient si tak sám pohodlně vyplní test a okamžitě obdrží výsledek, do kterého může „propašovat“ doporučení k návštěvě našich kursů.

Základem testu je dobře připravený formulář s otázkami. Záleží na naší nápaditosti, jak formulář připravíme, aby vyplnění testu bylo snadné, přehledné a neodrazovalo komplikovaností. Aby bylo možné test vyhodnotit automaticky a vyplnění bylo pohodlné, hodí se použít pole select a radio-buttony, použití textových polí je také možné, ovšem je potřeba důkladnějšího otestování při vyhodnocení (do pole může být napsáno cokoli) a navíc pro čtenáře není vypisování textových polí přitažlivé. Prohlédněte si krátkou ukázku testu znalostí angličtiny (funkční je pouze úroveň Začátečník).

Abychom mohli webtest snadno upravovat a využít více úrovní (např. začátečník – pokročilý – expert), vytvoříme si skript, který podle zadaného parametru nabídne test patřičné úrovně (pomocí include nebo require). Formulář bude předávat pro danou položku hodnotu pouze při zvolení správné odpovědi, což usnadní vyhodnocení. Navíc přidáme skrytou položku, ve které bude uveden počet otázek, takže můžeme snadno vyhodnotit i procentuální úspěšnost.

Nejprve si tedy ukažme hlavní skript webtestu, index.php:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
<title>Webtest</title>
</head>
<body>
<?php
$level=$level*1; // ošetření úrovně testu
$res=$res*1; // ošetření parametru pro vyhodnocení testu
$qst=$qst*1; // ošetření počtu otázek
if (!empty($_GET[‚level‘]))
{// je zvolena úroveň testu
  if (empty($_POST[‚res‘]) && empty($_POST[‚qst‘]))
  {
    if (file_exists(‚handle/testlevel‘.$_GET[‚level‘].‘.php‘))
   { // pokud není nastaven parametr pro vyhodnocení nebo počet otázek a existuje soubor s otázkami testu
?>
<fieldset><legend>Webtest <br /></legend>
<form action="index.php?level=<?php echo $_GET[‚level‘] ?>" method="POST">
<input type="hidden" name="res" value="1" />
<?php require(‚handle/testlevel‘.$_GET[‚level‘].‘.php‘) ?>
<input type="submit" class="tlac" value="vyhodnotit" />
</form>
</fieldset>
<?php
    }
    else
      echo ‚Poľadovaný test není k dispozici…‘;
  }
  else
  {// je nastaven parametr pro vyhodnocení a počet otázek
    if (file_exists(‚handle/testresume‘.$_GET[‚level‘].‘.php‘))
   { // existuje soubor vyhodnocení testu, sečíst výsledky a vydělit počtem otázek, vynásobit stem a zaokrouhlit (výsledek bude v procentech)
      $testresume=round(($_POST[‚Q1‘]*1 + $_POST[‚Q2‘]*1 + $_POST[‚Q3‘]*1 + $_POST[‚Q4‘]*1 + $_POST[‚Q5‘]*1 + $_POST[‚Q6‘]*1 + $_POST[‚Q7‘]*1 + $_POST[‚Q8‘]*1 + $_POST[‚Q9‘]*1 + $_POST[‚Q10‘]*1 + $_POST[‚Q11‘]*1 + $_POST[‚Q12‘]*1 + $_POST[‚Q13‘]*1 + $_POST[‚Q14‘]*1 + $_POST[‚Q15‘]*1 + $_POST[‚Q16‘]*1 + $_POST[‚Q17‘]*1 + $_POST[‚Q18‘]*1 + $_POST[‚Q19‘]*1 + $_POST[‚Q20‘]*1)/$_POST[‚qst‘],2)*100;
      require(‚handle/testresume‘.$_GET[‚level‘].‘.php‘);
    }
    else
      echo ‚Poľadované výsledky testu nejsou k dispozici…‘;
  }
}
else
{// nejsou zadány žádné parametry, zobrazí se vstupní stránka testu s odkazy na jednotlivé úrovně
?>
<ul>
<li><a href="index.php?level=1">Začátečník</a></li>
<li><a href="index.php?level=2">Pokročilý</a></li>
<li><a href="index.php?level=3">Expert</a></li>
</ul>
<?php
}
?>
</body>
</html>

Skript využívá $level pro určení úrovně testu. Pomocí require se pak pro zobrazení testu použijí soubory pojmenované jako testlevel1.php, testlevel2.php atd.. Pokud se formulář testu odešle, nastaví se proměnná $res na hodnotu 1 a zobrazí se vyhodnocení testu. K vyhodnocení testu se pak použijí soubory s názvy testresume1.php, testresume2.php atd.

Maximální počet otázek jednoho formuláře je 20, případně je možné rozšířit výraz počítající výsledek testu, anebo jej upravit tak, aby skript sám rozpoznal předané parametry podobně, jako univerzální skript pro odesílání. Zadání parametrů a existence požadovaných souborů s  částmi testu jsou samozřejmě ověřeny, aby se aplikace nezbortila v důsledku podvržení nesmyslných parametrů.

Formulář s otázkami může vypadat jako následující část skriptu testlevel1.php:

<!– pocet otazek testu –>
<input type="hidden" name="qst" value="2" />
<ol>
  <li>John is sitting <select name="Q1" size="1" class="sform">
    <option></option>
    <option value="1mz1lk5tb2m">at</option>
    <option value="bx3rbv45w">on</option>
    <option value="q76w2ubliny">in</option>
    </select> his desk.</li>
  <li>Where are you at 8:00 o’clock<br />
    <input type="radio" name="Q2" value="mz1lk5tb2mz" />this
    <input type="radio" name="Q2" value="bx3rbv45w" />at
    <input type="radio" name="Q2" value="1q76w2ublin" />in the<br />
    morning?</li>
</ol>

První skrytá položka udává počet otázek tohoto formuláře. Dále jsou ve formuláři dvě otázky: jedna je řešena pomocí select, druhá pomocí radio-buttonů. Povšimněte si pojmenování položek Q1, Q2, které je nutné dodržet, jinak nebude vyhodocení testu pracovat správně. Další otázky (maximální počet je 20, jak bylo zmíněno výše) pojmenujte Q3, Q4 atd.

Nejdůležitějším prvkem formuláře je určení správné hodnoty. Ve vyhodnocovacím skriptu se každá předaná hodnota násobí jedničkou, takže hodnota, která nezačíná číslem, bude vyhodnocena jako nesprávná – po vynásobení bude hodnota nulová. Toto krkolomné řešení je zvoleno pro zamezení odhadnutí správných odpovědí letmým pohledem do zdrojového kódu stránky. Je potřeba upozornit, že údaj správné odpovědi musí začínat vždy jedničkou (1) následovanou textem, jinak bude výsledná hodnota po vynásobení jedničkou jiná, než jedna a výsledek vyjádřený v procentech bude nesmyslný. V krajním případě může být i větší než 100%. Na první pohled je to možná složité, ale při přípravě takového formuláře prostě postačí do hodnot value zadat jakékoli shluky znaků nezačínající číslem. Vzniknou "opřením se do klávesnice", přičemž na začátek každé správné odpovědi nakonec přidáme jedničku a ověříme, že těsně za touto jedničkou nenásleduje číslo.

V souboru s vyhodnocením můžeme jednoduše (jako v naší ukázce) zobrazit procentuální výsledek obsažené v proměnné $testresume, efektnější však bude podmíněné rozhodnutí o zobrazení textového vyhodnocení (pomocí konstrukce if nebo switch) s případným doporučením a odkazem na naši nabídku služeb.

testresume1.php

Správných odpovědí: <?php echo $testresume ?>%<br />
<?php
if ($testresume<100)
echo ‚Mohlo by to být lepší – měl byste navštívit <a href="http://nejlepsikursy.cz/">náš kurs</a>.‘;
?>

Možnosti zobrazení výsledků testu již ponechávám na Vaší fantazii, můžete například i odkázat na další úroveň testu. Skripty ukázky si můžete stáhnout.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *