To w ogóle nie ma prawa działać, bo odpowiedzi w ogóle nie są przypisane do pytań w formularzu i tyle. Po pierwsze ilość pytań (zmienna $ilepytan) w bazie danych to nie to samo, co identyfikator pytania, dlatego nie możemy użyć tutaj num_rows chyba, że baza danych będzie cały czas taka sama i nikt nie usunie np. pytania o id 5, 20, czy 41. Jeśli docelowo mają być wyświetlane wszystkie pytania, to w ogóle nie ma się co nad tym zastanawiać i należy pozostać przy pierwszym zapytaniu:
SELECT * FROM `praca`;
które daje nam cały zestaw potrzebnych danych i można tylko na tym bazować bez konieczności tworzenia kolejnych pętli, w których wybieramy odpowiednio losowe pytania i ich liczbę. Jeśli z kolei liczba wyświetlanych pytań ma być zmienna, a baza danych jest mała, to można by spróbować zapytania:
SELECT * FROM `praca` ORDER BY RAND() LIMIT $liczbapytan;
gdzie zmienna $liczbapytan to ilość pytań, które chcemy pobrać z bazy danych. Zapytanie to wybierze nam gotowy zbiór losowych danych w oczekiwanej ilości.
Nie sprawdzi się jednak w przypadku dużych baz danych, gdzie trzeba szukać jakiejś konkretnej
metody optymalizacji zapytania albo odpowiedniego podejścia po stronie php.
W obu przypadkach możemy sobie utworzyć tablicę asocjacyjną, której indeks będzie jednocześnie identyfikatorem pytania:
$query = "NASZE ZAPYTANIE";
if($dane = $mysqli->query($query)) {
while ($wiersz = $dane->fetch_assoc()) {
$pytania[$wiersz["id"]] = $wiersz;
}
$dane->free();
}
// Dzięki temu otrzymujemy tablicę danych, jak niżej.
// W PRZYPADKU PIERWSZEGO ZAPYTANIA
/*
$pytania = [
1 => [
"id" => 1,
"pytanie" => "Pytanie 1 z bazy danych",
"odp1" => "Odpowiedź 1 na pytanie 1 z bazy danych",
"odp2" => "Odpowiedź 2 na pytanie 1 z bazy danych",
"poprawna" => "odp1 lub odp2"
],
2 => [
"id" => 2,
"pytanie" => "Pytanie 2 z bazy danych",
"odp1" => "Odpowiedź 1 na pytanie 2 z bazy danych",
"odp2" => "Odpowiedź 2 na pytanie 2 z bazy danych",
"poprawna" => "odp1 lub odp2"
],
itd...
];
*/
// W PRZYPADKU DRUGIEGO ZAPYTANIA
/*
$pytania = [
42 => [
"id" => 42,
"pytanie" => "Pytanie 42 z bazy danych",
"odp1" => "Odpowiedź 1 na pytanie 42 z bazy danych",
"odp2" => "Odpowiedź 2 na pytanie 42 z bazy danych",
"poprawna" => "odp1"
],
21 => [
"id" => 21,
"pytanie" => "Pytanie 21 z bazy danych",
"odp1" => "Odpowiedź 1 na pytanie 21 z bazy danych",
"odp2" => "Odpowiedź 2 na pytanie 21 z bazy danych",
"poprawna" => "odp2"
],
itd...
];
*/
Co ważne, kolumna poprawna w bazie danych powinna wskazywać tylko i wyłącznie numer poprawnej odpowiedzi (ewentualnie nazwę kolumny z poprawną odpowiedzią, czyli dosłownie odp1 lub odp2). Nie może przechowywać całej poprawnej odpowiedzi, bo będzie to kompletnie nieoptymalne i obarczone błędami. Skąd wiadomo, że w kolumnie poprawna nie pojawi się jakiś dodatkowy pusty znak? Wtedy porównanie udzielonej odpowiedzi z poprawną "bierze w łeb".Jeśli chcemy wyświetlić wszystkie pytania w losowej kolejności, to czeka nas jeszcze trochę zabawy, ale to już pozostawiam Tobie (dla ułatwienia proponuje przejrzeć komentarze do
shuffle). W każdym bądź razie docelowo nawet z pierwszego zapytania możemy uzyskać wymieszaną tablicę wszystkich lub ograniczonych ilościowo pytań wraz z powiązanymi odpowiedziami i wskazaniem tej poprawnej. Załóżmy, że mamy taką tablicę. Pozostaje zatem wygenerować elementy formularza:
// pokażę tylko, jak wygenerować elementy input typu radio powiązane z danym pytaniem
$i = 1; // sztuczne id (użytkownik końcowy nie musi, bądź nie powinien znać identyfikatora pytania z bazy danych
foreach($pytania as $id => $wiersz) {
echo "Pytanie {$i}: {$wiersz["pytanie
"]}<br>"; echo "<label><input type=\"radio\" name=\"odpowiedzi[{$wiersz["id
"]}]\" value=\"odp1\"> 1. {$wiersz["odp1
"]}</label><br>"; echo "<label><input type=\"radio\" name=\"odpowiedzi[{$wiersz["id
"]}]\" value=\"odp2\"> 2. {$wiersz["odp2
"]}</label><br>"; $i++;
}
// Wtedy (oczywiście jeśli tylko zaznaczymy którąś z odpowiedzi, bo w przeciwnym wypadku tablica odpowiedzi w zmiennej $_POST będzie pusta) dostaniemy coś takiego:
/*
$_POST = array(
[odpowiedzi] => array(
[42] => "odp1"
[21] => "odp2"
)
)
*/
// I poruszając się po tej tablicy sprawdzamy, czy udzielone odpowiedzi są poprawne, co znowu wiąże się z zabawą z tablicami
if(is_set($_POST["odpowiedzi"] {
$odpowiedzi = $_POST["odpowiedzi"];
foreach($odpowiedzi as $id_pytania => $wskazana_odpowiedz) {
// tutaj sprawdzamy, czy wskazana odpowiedź na pytanie o danym id jest poprawna, aczkolwiek niekoniecznie musi to być zrobione w pętli
}
}