Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

3 Stron V   1 2 3 >  
Reply to this topicStart new topic
> Wyświetlenie pytań oraz odpowiedzi z dwóch różnych tabel
M4rcin3z
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


Cześć.

Najpierw parę informacji o co mi chodzi.

Tworzę mini portal edukacyjny z generowanymi testami. Wszystko oparte o MySQL i PHP. Temat pilny.

Pytania oraz odpowiedzi są w dwóch różnych tabelach tj.:

Pytania:
ID_Pytania | ID_Testu | Tresc_Pytania

Odpowiedzi

ID_Odpowiedzi | ID_Pytania | Tresc_Odpowiedzi | Czy_Prawidlowa


A teraz do rzeczy. Potrzebuję wyświetlić pytanie a pod nim 4 odpowiedzi w radio buttonie. Mamy taki kod:

  1. <?php
  2.  
  3. $conn = mysql_connect ("localhost", "root", "") or
  4. die ("Nie można połączyć z bazą MySQL");
  5. $db = mysql_select_db ("quiz", $conn) or die (mysql_error());
  6.  
  7. $wynik = mysql_query("SELECT ID_Pytania, Tresc_Pytania
  8. From pytania Order by RAND() LIMIT 10;");
  9. //$zapytanie = mysql_query("SELECT ID_Odpowiedzi, Tresc_Odpowiedzi, Czy_Prawidlowa
  10. // FROM Odpowiedzi;");
  11. if (mysql_num_rows($wynik)>0)
  12. {
  13.  
  14. // echo '<input type="radio" name="'.$i.'" value="'.$wynik['Tresc_Odpowiedzi'].'" />'.$wynik["Tresc_Odpowiedzi"].'</br>';
  15. $i=1;
  16. echo '<form method="post" action="result.php">';
  17.  
  18. while($pytanie = mysql_fetch_array($wynik)){
  19. echo '<br>'.$i.'.'.$pytanie['Tresc_Pytania'].'</br>';
  20.  
  21. echo '<input type="radio" value="" /></br>';
  22. echo '<input type="radio" value="" /></br>';
  23. echo '<input type="radio" value="" /></br>';
  24. echo '<input type="radio" value="" /></br>';
  25. echo '<br>';
  26.  
  27. $i++;
  28. }
  29.  
  30. print '<INPUT type="submit" name="wyslij" value="Pokaż wynik">';
  31.  
  32. }
  33. ?>
  34.  


Póki co mam tylko wyświetlone w pętli pytania i po 4 radio do każdego i tutaj jest problem tongue.gif Jak wkleić pod te radio tresci odpowiedzi, które mam w bazie?
Już próbowałem pętle w pętli, ale nic nie dawało rady. Może zgłupiałem albo jestem cienki, a może coś przegapiłem. A żeby było śmieszniej potrzebowałbym żeby pytania były losowo wybierane i jak tu podczepić do losowych pytań odpowiedzi?

PS.

Jak nie ten dział to przepraszam, ale już tyle nad tym siedzę, że nie myślę tongue.gif
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Pobierasz z bazy pytania. Zapisujesz sobie do tablicy ich ID i pobierasz pytania do nich.

Iterujesz po tablicy pytań, wypisujesz treść pytania i potem kolejna pętla która iteruje po pytaniach i wyświetlasz pytania.

Oczywiście to najprostsze rozwiązanie, ale coś mi się wydaje że to temat na zaliczenie haha.gif
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #3





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


A możesz to bardziej w wersji kodu zapodać? tongue.gif Powiedzmy, że na zaliczenie wink.gif

Cytat(Pyton_000 @ 16.01.2015, 21:05:43 ) *
Pobierasz z bazy pytania. Zapisujesz sobie do tablicy ich ID i pobierasz pytania do nich.


Chyba miałeś na myśli, że pobieram sobie pytania. Zapisuje ich ID do tablicy i pobieram odpowiedzi do nich tongue.gif
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


"Literówka"

A czego nie rozumiesz w tym co napisałem. Część kodu już masz. No chyba że to nie Ty go pisałeś dry.gif
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #5





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


No jak nie pisałem jak pisałem.

Ale już parę razy kombinowałem i ani razu nie udało mi się zrobić tak jak chce :/

Nie za bardzo wiem, w którym miejscu miałbym wrzucić drugą pętle...
Go to the top of the page
+Quote Post
Pyton_000
post
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


pętla w pętli
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #7





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


A możesz taką przykładową, która wg Ciebie będzie działać tutaj? Jak powinna wyglądać. Bo ja tracę nadzieje :/
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Mam dziś za dobry dzień. Masz prawie gotowiec. Nic więcej Ci nie pomogę bo i tak już za dużo dostałeś.

  1. <?php
  2.  
  3. $pdo = new PDO('');
  4.  
  5. $sql = "SELECT * FROM questions";
  6. $sth = $pdo->prepare($sql);
  7. $sth->execute();
  8.  
  9. $questions = $sth->fetchAll(PDO::FETCH_ASSOC);
  10.  
  11. $questionsIds = array();
  12.  
  13. foreach ($questions as $question)
  14. {
  15. $questionsIds[] = $question['id'];
  16. }
  17.  
  18. $sth = $pdo->prepare("SELECT * FROM answers WHERE question_id IN(".implode(',', $questionsIds).")");
  19. $sth->execute();
  20. $answers = $sth->fetchAll(PDO::FETCH_ASSOC);
  21.  
  22. $answersPrepared = array();
  23. foreach($answers as $answers)
  24. {
  25. $answersPrepared[$answers['question_id']][] = $answers;
  26. }
  27.  
  28. foreach ($questions as $question)
  29. {
  30. echo "<h2>{$question['title']}</h2>";
  31. echo '<ul>';
  32. foreach($answersPrepared['question_id'] as $answers)
  33. {
  34. echo "<li><input type='checkbox' name='answer[{$answer['id']}]'>{$answer['title']}</li>";
  35. }
  36. echo '</ul>';
  37. }
  38.  
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #9





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


Ok, dzięki... Dla kogoś kto jest zielony sam kod niewiele daje... Jakakolwiek próba przerobienia i odpalenia i tak wyrzuca błędy.. Ale dzięki

Zrobiłem dwoma pętlami FOR. Efekt?

Pyt1
radio
radio
radio
radio

pyt2
radio
radio
radio
radio
itd.

  1. <?php
  2.  
  3. $conn = mysql_connect ("localhost", "root", "") or
  4. die ("Nie można połączyć z bazą MySQL");
  5. $db = mysql_select_db ("quiz", $conn) or die (mysql_error());
  6.  
  7.  
  8. $zapytanie = mysql_query("SELECT pyt.ID_Pytania, pyt.Tresc_Pytania, odp.Tresc_Odpowiedzi
  9. From pytania pyt, Odpowiedzi odp WHERE pyt.ID_Pytania = odp.ID_Pytania;");
  10.  
  11.  
  12. $result = mysql_query("SELECT pyt.ID_Pytania, pyt.Tresc_Pytania
  13. From pytania pyt;");
  14.  
  15. if((mysql_num_rows($result)>0) AND (mysql_num_rows($zapytanie)>0)){
  16. for ($i=1;$i<11;$i++){
  17. $pytanie = mysql_fetch_array($result);
  18. echo '<br>'.$i.'.'.$pytanie['Tresc_Pytania'].'</br>';
  19.  
  20. for ($j=0;$j<4;$j++){
  21. $odpowiedz = mysql_fetch_array($zapytanie);
  22. echo '<input type="radio" name="'.$j.'" value="'.$odpowiedz['Tresc_Odpowiedzi'].'" />'.$odpowiedz["Tresc_Odpowiedzi"].'</br>';
  23. }
  24.  
  25. }
  26. }
  27. ?>
  28.  
  29.  


Może komuś się przyda, jak nie w całości to w kawałkach.

Ten post edytował M4rcin3z 17.01.2015, 17:49:22
Go to the top of the page
+Quote Post
Pyton_000
post
Post #10





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Taaa... tylko że to nie działa poprawnie, no chyba że nie musi... Tak więc nie sądzę że się komuś przyda wink.gif

Ten post edytował Pyton_000 17.01.2015, 18:12:02
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #11





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


W jakim sensie nie działa to prawidłowo?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


W takim że pytania nijak się mają do odpowiedzi, no chyba że w BD masz w odpowiedniej kolejności pytania i odpowiedzi.
Poza tym radio są źle nazwane, brakuje identyfikacji odpowiedzi.
Użyta stara biblioteka mysql_*
Pobierasz wszystkie pytania i odpowiedzi, a wyświetlasz tylko 11 pytań. A co jak nie będzie tyle w BD? lipa..

Dalej nie chce mi się wymieniać.
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #13





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


Cytat(Pyton_000 @ 17.01.2015, 19:04:20 ) *
W takim że pytania nijak się mają do odpowiedzi, no chyba że w BD masz w odpowiedniej kolejności pytania i odpowiedzi.


Tak mam w odpowiedniej kolejności i pytania i odpowiedzi.


Nie jestem alfą i omegą, bo dopiero zaczynam na dobrą sprawę... Zawsze można się do czegoś przyczepić jak tylko się tego chce wink.gif


Ok, wracając do Twojej opcji.

Wszystko niby będzie ok, ale coś mi nie gra... Wywala błędy w jednym miejscu i nie wiem jak to ugryźć :/

CODE
Notice: Undefined index: ID_Pytania in C:\xampp\htdocs\EduPortal\test.php on line 46


CODE
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\EduPortal\test.php on line 46

Ten problem już mam z głowy... Dodany
  1. foreach([b](array)[/b]$answersPrepared['ID_Pytania'] as $answers)


Z tego co wyczytałem sugeruje, że dana zmienna nie jest tablicą i na tym forum ktoś pisał żeby sprawdzić czy jest w ogóle wypełniona tym sposobem:

  1. echo '<pre>';
  2. print_r($zmienna);
  3. echo '</pre>';


I mi pokazuje coś takiego:
CODE

Array
(
[7] => Array
(
[0] => Array
(
[ID_Odpowiedzi] => 25
[ID_Pytania] => 7
[Tresc_Odpowiedzi] => jako zbiór krotek, które w znormalizowanych bazach danych s? unikatowe i nie gra roli ich kolejno??
[Czy_prawidlowa] => 1
)

[1] => Array
(
[ID_Odpowiedzi] => 26
[ID_Pytania] => 7
[Tresc_Odpowiedzi] => jako zbiór krotek, które w znormalizowanych bazach danych s? unikatowe i ich kolejno?? gra rol?
[Czy_prawidlowa] => 0
)

[2] => Array
(
[ID_Odpowiedzi] => 27
[ID_Pytania] => 7
[Tresc_Odpowiedzi] => jako zbiór krotek, które w znormalizowanych bazach danych s? powtarzalne i ich kolejno?? gra rol?
[Czy_prawidlowa] => 0
)

[3] => Array
(
[ID_Odpowiedzi] => 28
[ID_Pytania] => 7
[Tresc_Odpowiedzi] => elementy manipulacyjne modelu
[Czy_prawidlowa] => 0
)

)

[8] => Array
(
[0] => Array
(
[ID_Odpowiedzi] => 29
[ID_Pytania] => 8
[Tresc_Odpowiedzi] => Jest bogaty i pracuje jako konsultant dla Sun Mycrosystems.
[Czy_prawidlowa] => 0
)

[1] => Array
(
[ID_Odpowiedzi] => 30
[ID_Pytania] => 8
[Tresc_Odpowiedzi] => Procesuje si? o prawa do wykorzystywania jego pomys?u przez podmioty komercyjne.
[Czy_prawidlowa] => 0
)

[2] => Array
(
[ID_Odpowiedzi] => 31
[ID_Pytania] => 8
[Tresc_Odpowiedzi] => Opracowuje nowy typ relacyjnych baz danych
[Czy_prawidlowa] => 0
)

[3] => Array
(
[ID_Odpowiedzi] => 32
[ID_Pytania] => 8
[Tresc_Odpowiedzi] => Nie ?yje
[Czy_prawidlowa] => 1
)

)

[10] => Array
(
[0] => Array
(
[ID_Odpowiedzi] => 37
[ID_Pytania] => 10
[Tresc_Odpowiedzi] => ...to poprzedniczka relacyjnej bazy danych, obecnie nieu?ywana.
[Czy_prawidlowa] => 0
)

[1] => Array
(
[ID_Odpowiedzi] => 38
[ID_Pytania] => 10
[Tresc_Odpowiedzi] => ...znajduje si? w fazach prototypowych i nie powsta?y dotychczas rozwi?zania komercyjne.
[Czy_prawidlowa] => 1
)

[2] => Array
(
[ID_Odpowiedzi] => 39
[ID_Pytania] => 10
[Tresc_Odpowiedzi] => ...to zbiór obiektów, których zachowanie si?, stan oraz zwi?zki s? okre?lone zgodnie z obiektowym modelem danych
[Czy_prawidlowa] => 0
)

[3] => Array
(
[ID_Odpowiedzi] => 40
[ID_Pytania] => 10
[Tresc_Odpowiedzi] => ...nie istnieje
[Czy_prawidlowa] => 0
)

)

)


Czyli znaczyłoby, że jest wypełniona i ID_Pytania w tej tablicy się znajduje, więc gdzie leży problem? Zapodam kod:
  1. <?php
  2. $mysql_host = 'localhost'; //lub jakiś adres: np sql.nazwa_bazy.nazwa.pl
  3. $port = '3306'; //domyślnie jest to port 3306
  4. $username = 'root';
  5. $password = '';
  6. $database = 'quiz'; //'produkty'
  7.  
  8. try{
  9. $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
  10. echo 'Połączenie nawiązane!';
  11. }catch(PDOException $e){
  12. echo 'Połączenie nie mogło zostać utworzone.<br />';
  13. }
  14.  
  15.  
  16.  
  17. $sql = "SELECT * FROM pytania ORDER BY RAND() LIMIT 3";
  18. $sth = $pdo->prepare($sql);
  19. $sth->execute();
  20.  
  21. $questions = $sth->fetchAll(PDO::FETCH_ASSOC);
  22.  
  23. $questionsIds = array();
  24.  
  25. foreach ($questions as $question)
  26. {
  27. $questionsIds[] = $question['ID_Pytania'];
  28. }
  29.  
  30. $sth = $pdo->prepare("SELECT * FROM Odpowiedzi WHERE ID_Pytania IN(".implode(',', $questionsIds).")");
  31. $sth->execute();
  32. $answers = $sth->fetchAll(PDO::FETCH_ASSOC);
  33.  
  34. $answersPrepared = array();
  35. foreach($answers as $answers)
  36. {
  37. $answersPrepared[$answers['ID_Pytania']][] = $answers;
  38. }
  39. echo '<pre>';
  40. print_r($answersPrepared);
  41. echo '</pre>';
  42. foreach ($questions as $question)
  43. {
  44. echo "<h2>{$question['Tresc_Pytania']}</h2>";
  45. echo '<ul>';
  46. foreach($answersPrepared['ID_Pytania'] as $answers)
  47. {
  48. echo "<li><input type='checkbox' name='answer[{$answer['ID_Pytania']}]'>{$answer['Tresc_Odpowiedzi']}</li>";
  49. }
  50. echo '</ul>';
  51. }
  52.  
  53. ?>


Ten post edytował M4rcin3z 18.01.2015, 09:23:03
Go to the top of the page
+Quote Post
Pyton_000
post
Post #14





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Brawo..
zamień
foreach($answersPrepared['ID_Pytania'] as $answers)
na
foreach($answersPrepared[$question['ID_Pytania']] as $answers)
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #15





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


Ok działa (zaraz napiszesz, że wiesz że działa wink.gif ). Jeszcze tylko sprawdzenie i zliczenie ile użytkownik zaznaczył poprawnych odpowiedzi i będzie koniec. Mam nadzieję, że dam sobie z tym już sam radę wink.gif


Dzięki wielkie i sorry za upierdliwość (ale tak mam, że jak czegoś nie wiem a ktoś mi podpowiada to chce wiedzieć na później jak najwięcej) tongue.gif

PS.

Kliknięte "POMÓGŁ".

Nie rozpoczynając nowego tematu.

Jestem zmuszony sytuacją, że proszę o pomoc ponownie tym razem z tym zliczaniem poprawnych odpowiedzi.

W tabeli odpowiedzi jest pole Czy_prawidlowa (1- poprawna, 0-bledna).

Mam trochę problem z rozgryzieniem jaki warunek wrzucic zeby zaczelo zliczac... Warunek w sumie mam juz w glowie tylko nie bardzo wiem jak to przelac na wersje PHP :/

Podpowie ktos?
Go to the top of the page
+Quote Post
rad11
post
Post #16





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  1. SELECT count(*) FROM tabela WHERE Czy_prawidlowa = 1
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #17





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


To daje ze bede mial wyswietlone i liczone... A jak to ma sie do weryfikacji tego co zaznaczyl uzytkownik?


Może inaczej.

Chodzi mi oto jak mogę sprawdzić czy zaznaczony radio button ma w kolumnie Czy_prawidlowa wartosc 1 czyli poprawna odpowiedzi? W takim przypaku naliczylo za to pkt dla uzytkownika.

Ten post edytował M4rcin3z 20.01.2015, 14:16:38
Go to the top of the page
+Quote Post
Pyton_000
post
Post #18





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Po przesłaniu odpowiedzi zbierasz ich ID z formularza, pobierasz z BD wszystkie pytania o tych ID i dalej sobie robisz co chcesz czyli możesz wyświetlić błędne odpowiedzi itd.

Natomiast jeżeli interesuje Cię tylko ilość poprawnych to

  1. SELECT COUNT(id) FROM odpowiedzi WHERE id IN(1,2,4,5) AND czy_prawidlowa = 1
Go to the top of the page
+Quote Post
M4rcin3z
post
Post #19





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.03.2013

Ostrzeżenie: (0%)
-----


No ok, tylko proszę łopatologicznie jak pobrać je z formularza?

Chyba robię się coraz głupszy niż mądrzejszy... :/
Go to the top of the page
+Quote Post
Pyton_000
post
Post #20





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Weź sobie jakiś kurs PHP od podstaw to staniesz się coraz mądrzejszy...
Go to the top of the page
+Quote Post

3 Stron V   1 2 3 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 00:47