Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ Problem przy pobieraniu danych metoda $POST

Napisany przez: MrMethodCube 30.04.2018, 15:36:27

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.

  1. <?php
  2. require_once "connect.php";
  3. $polaczenie =@new mysqli($host, $db_user, $db_password, $db_name);
  4.  
  5.  
  6. if($polaczenie->connect_errno!=0)
  7. {
  8. http://www.php.net/echo "Jest jakis blad";
  9. }
  10. else
  11. {
  12. //////////// SPRAWDZA ILE PYTAN JEST W TABELI!
  13. $ile= "SELECT * FROM praca"; //zapytanie.
  14.  
  15. if($rezultat= @$polaczenie->query($ile))//bez ifa to jest wyslanie pytania do bazy.
  16. {
  17. $ilepytan = $rezultat->num_rows;//liczba wierszy z naszym zapytaniem.
  18. http://www.php.net/echo " <h3> W bazie jest nastepujaca ilosc pytan: $ilepytan </h3>" ;
  19. }
  20. ///////////
  21.  
  22. ////////--- WŁAŚCIWY KOD ---//////////
  23.  
  24. $liczba_pytan= http://www.php.net/array();
  25. $ntab=http://www.php.net/array();
  26. $tab_3= http://www.php.net/array();
  27. $odpowiedzi= http://www.php.net/array();
  28. $dobraodp= http://www.php.net/array();
  29.  
  30. for($i=1;$i<=$ilepytan;$i++)
  31. {
  32. $liczba_pytan[]=$i;
  33. }
  34.  
  35. http://www.php.net/shuffle($liczba_pytan); //mieszam elementy tablicy (w założeniach pytania wyświetlaja sie losowo)
  36.  
  37. foreach($liczba_pytan as $v)
  38. {
  39. $ntab[]=$v;
  40. }
  41.  
  42. for($n=0;$n<3;$n++)/// Zrobiłem sobie nową talbice zawierajaca 3 elementy- z tej wymieszanej.
  43. {
  44. $tab_3[]=$ntab[$n];
  45. }
  46.  
  47.  
  48. foreach($tab_3 as $kay => $i)
  49. {
  50.  
  51. $sql= "SELECT * FROM praca WHERE id='$i'"; //zapytanie.
  52.  
  53. if($rezultat= @$polaczenie->query($sql))
  54. {
  55. $ile_pytan = $rezultat->num_rows;//liczba wierszy z naszym zapytaniem.
  56.  
  57. if($ile_pytan>0)
  58. {
  59. $wiersz = $rezultat->fetch_assoc();//tablica asocjacyjna.
  60. $id=$wiersz['id'];
  61. $pytanie=$wiersz['pytanie'];
  62. $odp1=$wiersz['odp1'];
  63. $odp2=$wiersz['odp2'];
  64. $poprawna=$wiersz['poprawna'];
  65.  
  66.  
  67. //$ID=$kay+1;
  68. //echo "Sztuczne ID: ".$ID."<br>";
  69. http://www.php.net/echo $id.". <br> Pytanie:".$pytanie."<br>";
  70.  
  71. http://www.php.net/echo "Odpowiedzi: <br>";
  72.  
  73. $radio= $kay;
  74.  
  75.  
  76. http://www.php.net/echo "1. $odp1 ";
  77. http://www.php.net/echo "<input type='radio' name='$radio' value='$odp1'> <br>";
  78. http://www.php.net/echo "2. $odp2 ";
  79. http://www.php.net/echo "<input type='radio' name='$radio' value='$odp2'> <br>";
  80. http://www.php.net/echo "Poprawna odpowiedz to " . $poprawna. "<br>";
  81. http://www.php.net/echo "<br>";
  82.  
  83.  
  84. $dobraodp[]=$poprawna;
  85. $odpowiedzi[]= $radio;
  86.  
  87. }
  88. else
  89. {
  90. http://www.php.net/echo "<h1>W tej bazie nie ma pytan! :(</h1>";
  91. }
  92.  
  93. }
  94.  
  95. }
  96.  
  97.  
  98. }
  99. ?>
  100.  
  101. <input type="submit" name="wyslij" value="Zakoncz!" >
  102.  
  103.  
  104. </form>
  105.  
  106.  
  107. <?php
  108. //PROBLEM ZACZYNA SIE W TYM MIEJSCU:
  109. //foreach($odpowiedzi as $kay => $i)
  110.  
  111.  
  112. for($i=0;$i<3;$i++)
  113. {
  114. if(http://www.php.net/isset($_POST[$odpowiedzi[$i]]))
  115. {
  116. http://www.php.net/echo "Odpowiedz która zaznaczyles to: " . $_POST[$odpowiedzi[$i]]. "<br>";
  117. http://www.php.net/echo "<br> A porpawna odp to: ". $_POST[$dobraodp[$i]]; //<- to nie dziala
  118. }
  119. }
  120. ?>


A bład po wcisniecu przycisku zakoncz: Notice: Undefined index
Dlaczego tak się dzieje?

Napisany przez: Kshyhoo 30.04.2018, 15:56:24

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...

Napisany przez: emillo91 1.05.2018, 09:35:02

A wywal tablicę odpowiedzi po za warunki. Może to chodzi właśnie o nią.

Napisany przez: LowiczakPL 2.05.2018, 06:25:53

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

  1. http://www.php.net/echo "<input type='radio' name='$radio' value='$odp1'> <br>";


czyli jak dla mnie powinno wyglądać to tak

  1. http://www.php.net/echo "<input type='radio' name='odp' value='{$kay}'> <br>";


i wtedy pobierasz to

  1. $_POST[$odp]

Napisany przez: MrMethodCube 3.05.2018, 23:34:34

Tylko moim problemem nie jest wyświetlenie odpowiedzi którą zaznaczyłem wink.gif 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.

Napisany przez: Pyton_000 4.05.2018, 08:58:41

var_dump($_POST);

Napisany przez: LowiczakPL 4.05.2018, 09:08:27

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.

Napisany przez: mortus 4.05.2018, 13:24:29

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:

  1. 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:
  1. 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 http://blog.vokiel.com/mysql-rand-jak-pobrac-losowe-wiersze/ 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:
  1. $query = "NASZE ZAPYTANIE";
  2. if($dane = $mysqli->query($query)) {
  3. $pytania = http://www.php.net/array();
  4. while ($wiersz = $dane->fetch_assoc()) {
  5. $pytania[$wiersz["id"]] = $wiersz;
  6. }
  7. $dane->free();
  8. }
  9. // Dzięki temu otrzymujemy tablicę danych, jak niżej.
  10. // W PRZYPADKU PIERWSZEGO ZAPYTANIA
  11. /*
  12. $pytania = [
  13.   1 => [
  14.   "id" => 1,
  15.   "pytanie" => "Pytanie 1 z bazy danych",
  16.   "odp1" => "Odpowiedź 1 na pytanie 1 z bazy danych",
  17.   "odp2" => "Odpowiedź 2 na pytanie 1 z bazy danych",
  18.   "poprawna" => "odp1 lub odp2"
  19.   ],
  20.   2 => [
  21.   "id" => 2,
  22.   "pytanie" => "Pytanie 2 z bazy danych",
  23.   "odp1" => "Odpowiedź 1 na pytanie 2 z bazy danych",
  24.   "odp2" => "Odpowiedź 2 na pytanie 2 z bazy danych",
  25.   "poprawna" => "odp1 lub odp2"
  26.   ],
  27. itd...
  28. ];
  29. */
  30. // W PRZYPADKU DRUGIEGO ZAPYTANIA
  31. /*
  32. $pytania = [
  33.   42 => [
  34.   "id" => 42,
  35.   "pytanie" => "Pytanie 42 z bazy danych",
  36.   "odp1" => "Odpowiedź 1 na pytanie 42 z bazy danych",
  37.   "odp2" => "Odpowiedź 2 na pytanie 42 z bazy danych",
  38.   "poprawna" => "odp1"
  39.   ],
  40.   21 => [
  41.   "id" => 21,
  42.   "pytanie" => "Pytanie 21 z bazy danych",
  43.   "odp1" => "Odpowiedź 1 na pytanie 21 z bazy danych",
  44.   "odp2" => "Odpowiedź 2 na pytanie 21 z bazy danych",
  45.   "poprawna" => "odp2"
  46.   ],
  47. itd...
  48. ];
  49. */

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 http://php.net/manual/en/function.shuffle.php). 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:
  1. // pokażę tylko, jak wygenerować elementy input typu radio powiązane z danym pytaniem
  2. $i = 1; // sztuczne id (użytkownik końcowy nie musi, bądź nie powinien znać identyfikatora pytania z bazy danych
  3. foreach($pytania as $id => $wiersz) {
  4. http://www.php.net/echo "Pytanie {$i}: {$wiersz["pytanie"]}<br>";
  5. http://www.php.net/echo "Odpowiedzi:<br>";
  6. http://www.php.net/echo "<label><input type=\"radio\" name=\"odpowiedzi[{$wiersz["id"]}]\" value=\"odp1\"> 1. {$wiersz["odp1"]}</label><br>";
  7. http://www.php.net/echo "<label><input type=\"radio\" name=\"odpowiedzi[{$wiersz["id"]}]\" value=\"odp2\"> 2. {$wiersz["odp2"]}</label><br>";
  8. $i++;
  9. }
  10. // 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:
  11. /*
  12. $_POST = array(
  13.   [odpowiedzi] => array(
  14.   [42] => "odp1"
  15.   [21] => "odp2"
  16.   )
  17. )
  18. */
  19. // I poruszając się po tej tablicy sprawdzamy, czy udzielone odpowiedzi są poprawne, co znowu wiąże się z zabawą z tablicami
  20. if(is_set($_POST["odpowiedzi"] {
  21. $odpowiedzi = $_POST["odpowiedzi"];
  22. foreach($odpowiedzi as $id_pytania => $wskazana_odpowiedz) {
  23. // tutaj sprawdzamy, czy wskazana odpowiedź na pytanie o danym id jest poprawna, aczkolwiek niekoniecznie musi to być zrobione w pętli
  24. }
  25. }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)