Jestem w trakcie tworzenia testu w PHP. Mam taki problem, że po zaznaczeniu odpowiedzi wyświetla mi jakie odpowiedzi zaznaczyłem, lecz przy sprawdzeniu poprawnej odpowiedzi, wywala mi błąd.
<?php require_once "connect.php"; $polaczenie =@new mysqli($host, $db_user, $db_password, $db_name); if($polaczenie->connect_errno!=0) { http://www.php.net/echo "Jest jakis blad"; } else { //////////// SPRAWDZA ILE PYTAN JEST W TABELI! $ile= "SELECT * FROM praca"; //zapytanie. if($rezultat= @$polaczenie->query($ile))//bez ifa to jest wyslanie pytania do bazy. { $ilepytan = $rezultat->num_rows;//liczba wierszy z naszym zapytaniem. http://www.php.net/echo " <h3> W bazie jest nastepujaca ilosc pytan: $ilepytan </h3>" ; } /////////// ////////--- WŁAŚCIWY KOD ---////////// $liczba_pytan= http://www.php.net/array(); $ntab=http://www.php.net/array(); $tab_3= http://www.php.net/array(); $odpowiedzi= http://www.php.net/array(); $dobraodp= http://www.php.net/array(); for($i=1;$i<=$ilepytan;$i++) { $liczba_pytan[]=$i; } http://www.php.net/shuffle($liczba_pytan); //mieszam elementy tablicy (w założeniach pytania wyświetlaja sie losowo) foreach($liczba_pytan as $v) { $ntab[]=$v; } for($n=0;$n<3;$n++)/// Zrobiłem sobie nową talbice zawierajaca 3 elementy- z tej wymieszanej. { $tab_3[]=$ntab[$n]; } foreach($tab_3 as $kay => $i) { $sql= "SELECT * FROM praca WHERE id='$i'"; //zapytanie. if($rezultat= @$polaczenie->query($sql)) { $ile_pytan = $rezultat->num_rows;//liczba wierszy z naszym zapytaniem. if($ile_pytan>0) { $wiersz = $rezultat->fetch_assoc();//tablica asocjacyjna. $id=$wiersz['id']; $pytanie=$wiersz['pytanie']; $odp1=$wiersz['odp1']; $odp2=$wiersz['odp2']; $poprawna=$wiersz['poprawna']; //$ID=$kay+1; //echo "Sztuczne ID: ".$ID."<br>"; http://www.php.net/echo $id.". <br> Pytanie:".$pytanie."<br>"; http://www.php.net/echo "Odpowiedzi: <br>"; $radio= $kay; http://www.php.net/echo "1. $odp1 "; http://www.php.net/echo "<input type='radio' name='$radio' value='$odp1'> <br>"; http://www.php.net/echo "2. $odp2 "; http://www.php.net/echo "<input type='radio' name='$radio' value='$odp2'> <br>"; http://www.php.net/echo "Poprawna odpowiedz to " . $poprawna. "<br>"; http://www.php.net/echo "<br>"; $dobraodp[]=$poprawna; $odpowiedzi[]= $radio; } else { http://www.php.net/echo "<h1>W tej bazie nie ma pytan! :(</h1>"; } } } } ?> <input type="submit" name="wyslij" value="Zakoncz!" > </form> <?php //PROBLEM ZACZYNA SIE W TYM MIEJSCU: //foreach($odpowiedzi as $kay => $i) for($i=0;$i<3;$i++) { if(http://www.php.net/isset($_POST[$odpowiedzi[$i]])) { http://www.php.net/echo "Odpowiedz która zaznaczyles to: " . $_POST[$odpowiedzi[$i]]. "<br>"; http://www.php.net/echo "<br> A porpawna odp to: ". $_POST[$dobraodp[$i]]; //<- to nie dziala } } ?>
Notice to informacja, że nie index istnieje. Gdybyś napisał, jaki to index, może nie trzeba by patrzeć w szklaną kulę. Powód zapewne ten sam, co zazwyczaj: przed wysłaniem formularza skrypt nie widzi zmiennej...
A wywal tablicę odpowiedzi po za warunki. Może to chodzi właśnie o nią.
Problem raczej tkwi w polu input, przypisujesz do niego index, a przecież name to nazwa przesyłanej zmiennej np, odpowiedz, a value powinien zawierac twój index czyli $kay
http://www.php.net/echo "<input type='radio' name='$radio' value='$odp1'> <br>";
http://www.php.net/echo "<input type='radio' name='odp' value='{$kay}'> <br>";
$_POST[$odp]
Tylko moim problemem nie jest wyświetlenie odpowiedzi którą zaznaczyłem Problem jest w metodzie POST... ponieważ jeśli chcę wyświetlić poprawną odpowiedź np.
echo " Porpawna odp to: ".$dobraodp[0]; to działa. Ale gdy dam już $_POST[$dobraodp[0]] to nie działa. Chociaż tablica $dobraodp jest w formularzu i powinna być stworzona po wciśnięciu przycisku wysyłania.
var_dump($_POST);
To nie ma prawa działać, bo zmienna nie może mieć POLSKICH znaków ani SPACJI, odpowiedziałem wyżej co masz zrobić aby to zadziałało.
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`;
SELECT * FROM `praca` ORDER BY RAND() LIMIT $liczbapytan;
$query = "NASZE ZAPYTANIE"; if($dane = $mysqli->query($query)) { $pytania = http://www.php.net/array(); 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... ]; */
// 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) { http://www.php.net/echo "Pytanie {$i}: {$wiersz["pytanie"]}<br>"; http://www.php.net/echo "Odpowiedzi:<br>"; http://www.php.net/echo "<label><input type=\"radio\" name=\"odpowiedzi[{$wiersz["id"]}]\" value=\"odp1\"> 1. {$wiersz["odp1"]}</label><br>"; http://www.php.net/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 } }
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)