Autor | Zpráva | ||
---|---|---|---|
xaverista Profil |
#1 · Zasláno: 21. 4. 2015, 19:49:09
Zdravím, prosím vás o nějaké nápady :-) vytvářím online testy pomocí php a mysql. Mám tabulku ,,otazky,, a tam sloupce.,,id,otazka,a,b,c,,
Už mám i administraci otázek pro přidání otázky a odpovědí. Už mám i vypsání testu, ale potřeboval bych poradit, jak vyhodnotit tento test, a to tak, že ho to potom přesměruje na stránku, kde uvidí co označil správně a co špatně + správnou odpověď. A ještě by bylo dobré, aby se otázky náhodně generovali (přehazovalo se pořadí otázek i prohození odpovědí). Vím,že je toho asi moc, ale budu vděčný za každou radu. Děkuji :-) |
||
Alphard Profil |
Tak na začátek, máte to špatně navržené, možné odpovědi patří do samostatné tabulky.
To vyhodnocení bych udělal jednoduchým porovnáním v php. Předpokládám, že při výpisu odpovědi máte k dispozici informaci, jestli je správná. Můžete se podívat do pole $_POST (resp. jeho zálohy po přesměrování) a porovnat uživatelsky zadanou hodnotu s tou z databáze. Prakticky jde jen o rozšíření algoritmu pro výpis testu.
|
||
xaverista Profil |
Takže jestli chápu správně. To tabulky otazky dám sloupce id a otazka a do tabulky odpovědi id, id-otazky,a,b,c...
Potom mám u výpisu pouze zobrazení, nevím jak ošéfovat správnou odpověď při výpisu 30 otázek. A ještě jak vypsat náhodně několik otázek a procházet odpovědi a rozeznat tu správnou odpověď. |
||
juriad Profil |
Máš špatně navrženou databázi. Měl bys mít dvě tabulky:
otázky (id, otazka) odpovědi (id, otazka_id, odpoved, spravna) Pak bys mohl položit dotaz do databáze (náhodné pořadí odpovědí): SELECT * FROM otazky q JOIN odpovedi a ON q.id = a.otazka_id ORDER BY q.id, RAND() Vyhodnocení: SELECT q.*, SUM(a1.spravne) = SUM(a2.spravne) AS spravne FROM otazky q JOIN odpovedi a1 ON q.id = a1.otazka_id LEFT JOIN odpovedi a2 ON a1.id = a2.id WHERE a2.id IN (seznam id odpovedi uzivatele) GROUP BY a1.otazka ORDER BY q.id Pokud bys však chtěl znát i správné odpovědi, je lepsíš porovnání udělat v PHP. Pak prostě vybereš z databáze všechny odpovědi a zkontroluješ, zda ID správných přesně odpovídá ID těch od uživatele. Třeba funkcí array_diff oběma směry (že vybral všechny správné odpovědi a že nevybral žádnou navíc). |
||
xaverista Profil |
Ano, chtěl bych znát i správné odpovědi. Ale jak tak vidím, tak to vzdám nebo udělám nějakou velice odlehčenou verzi. Každopádně děkuji určitě se bude hodit
|
||
Alphard Profil |
#6 · Zasláno: 21. 4. 2015, 20:17:53
Přesně tak, pak budete moci mít libovolný počet otázek.
A k tomu vyhodnocení. Správnost odpovědi bude uložena ve sloupci v tabulce odpovědi. Při vyplňování testu tam budou předpokládám nějaké checkboxy s name ve tvaru např. name="answers[56]" , kde 56 je id odpovědi. Při vyhodnocování pak stačí u otázky podmínka
if ($db_otazka_je_spravna && !empty($_POST['answers'][$idOtazky])) juriad popisuje metodu, jak to vyhodnotit vše najednou. Já uvádím způsob, jak vyhodnotit jednotlivě každou otázku a třeba obarvit zeleně/červeně. |
||
xaverista Profil |
Alphard:
A tato metoda bude fungovat při vypsání 30 otázek na stránce? Jinak a jak potom mohu uložit do db jednotlivé oodpovědi uživatele? A ještě jak by se dali prohodit ty odpovědi a otázky? |
||
Alphard Profil |
#8 · Zasláno: 21. 4. 2015, 20:24:50
xaverista:
„A tato metoda bude fungovat při vypsání 30 otázek na stránce?“ Ano, na (rozumném) počtu nezáleží. V poli $_POST['answers'] budou checkboxy, které uživatel zatrhl. Jen prohledáváte seznam.
Při ukládání projdete cyklem to pole $_POST['answers'] a po jednom uložíte do databáze (šlo by to i efektivněji, ale to až příště).
|
||
xaverista Profil |
#9 · Zasláno: 21. 4. 2015, 20:30:08 · Upravil/a: xaverista
Děkuji, něco snad zvládnu :-)
Alphard: Jestli bych vás mohl poprosit o vysvětlení, jak mohu postupně projet všechny $_POST... Jednotlivě jsem to ještě nikdy nedělal a nejsem až tak moc zběhlý. Moc se omlouvám, ale nějak mne nenapadá jak všechny postupně projet a uložit do databáze. Uložení do databáze zvládnu, horší je projetí všech POST Ještě jednou se omlouvám. |
||
Keeehi Profil |
#10 · Zasláno: 21. 4. 2015, 21:10:42
xaverista:
Na projití všech položek pole ($_POST je obyčejné pole) použij foreach cyklus. |
||
xaverista Profil |
Alphard:
> Při vyhodnocování pak stačí u otázky podmínka > if ($db_otazka_je_spravna && !empty($_POST['answers'][$idOtazky])) Prosím, co myslíte tím $db_otazka_je_spravna ? Co je v té proměnné? Nejak jsem ji nepochopi. Poté nějaké checkboxy s name ve tvaru např. name="answers[56]", kde 56 je id odpovědi. Tady je 56 id odpovědi a tady je id otázky $_POST['answers'][$idOtazky]) Děkuji |
||
Alphard Profil |
xaverista:
„Prosím, co myslíte tím $db_otazka_je_spravna ?“ Informaci z databáze, jestli má být aktuální otázka správně vybraná, nebo ne. Reálně to v nějakém cyklu bude $otazka['je_spravna'] .
Ta druhá část se mi zdá docela jasná. Při generování se sestaví name v uvedeném tvaru a po odeslání si můžete vypsat print_r($_POST) , ať lépe vidíte, s čím pracujete. Alternativně může být name jen name="answers[]" a id dát do value , možností je více.
Teď jsem si uvědomil, že v té podmínce mám logickou chybu. Musí to být nějak takhle if ($db_otazka_je_spravna !== empty($_POST['answers'][$idOtazky])) |
||
Alphard Profil |
$questions = [ [ 'question' => 'Jaka je vase oblibena barva?', 'answers' => [ ['Cervena', false], ['Zelena', false], ['Modra', true], ] ], [ 'question' => 'Jaky je smysl zivota?', 'answers' => [ ['Nevim', false], ['42', true], ['Zeptej se Fausta', false], ] ], [ 'question' => 'Jake je nejlepsi programatorske forum?', 'answers' => [ ['Djpw', true], ['Stackoverflow', true], ['Bravicko', false], ] ], ]; echo '<form method=post>'; foreach ($questions as $qKey => $question) { echo $question['question'], '<br>'; foreach ($question['answers'] as $aKey => $answer) { $empty = empty($_POST['answers'][$qKey][$aKey]); $color = ($questions[$qKey]['answers'][$aKey][1] !== $empty) ? 'green' : 'red'; echo '<input type=checkbox name="answers['.$qKey.']['.$aKey.']"'.($empty?'':' checked').'><span style="color:'.$color.'">', $answer[0], '</span><br>'; } echo '<br><br>'; } echo '<input type=submit></form>'; |
||
Časová prodleva: 8 let
|
0