Autor Zpráva
xaverista
Profil
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)
Sloupec správná bude obsahovat 0/1; uvědom si, že toto umožňuje vytvářet testy s více správnými odpovědmi (což se časem může hodit).

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
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
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
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
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>';

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: