Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlenie pytań oraz odpowiedzi z dwóch różnych tabel
Forum PHP.pl > Forum > PHP
M4rcin3z
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
Pyton_000
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
M4rcin3z
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
Pyton_000
"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
M4rcin3z
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...
Pyton_000
pętla w pętli
M4rcin3z
A możesz taką przykładową, która wg Ciebie będzie działać tutaj? Jak powinna wyglądać. Bo ja tracę nadzieje :/
Pyton_000
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.  
M4rcin3z
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.
Pyton_000
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
M4rcin3z
W jakim sensie nie działa to prawidłowo?
Pyton_000
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ć.
M4rcin3z
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. ?>
Pyton_000
Brawo..
zamień
foreach($answersPrepared['ID_Pytania'] as $answers)
na
foreach($answersPrepared[$question['ID_Pytania']] as $answers)
M4rcin3z
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?
rad11
  1. SELECT count(*) FROM tabela WHERE Czy_prawidlowa = 1
M4rcin3z
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.
Pyton_000
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
M4rcin3z
No ok, tylko proszę łopatologicznie jak pobrać je z formularza?

Chyba robię się coraz głupszy niż mądrzejszy... :/
Pyton_000
Weź sobie jakiś kurs PHP od podstaw to staniesz się coraz mądrzejszy...
M4rcin3z
Ale fajnie by było jakbyś mi pomógł tongue.gif
Pyton_000
Pomogłem, gotowca więcej ode mnie nie dostaniesz. I nie dla tego że jestem wredny (no bo jestem haha.gif) ale dla tego że z każdą pierdołą będziesz leciał na forum i liczył na gotowce.
To nie na tym zabawa polega. Albo chcesz być programistą i się uczyć tego, albo nie wtedy płacisz za czyjąś wiedzę.

http://pl.wikibooks.org/wiki/PHP/Formularze

PS. Szukanie na prawdę nie boli...
M4rcin3z
Nie bede biegac, bo musze zrobic to max do konca czwartku i miec z glowy... Jest to dosc pilny termin, a jeszcze pare innych rzeczy mam do zrobienia :/ Dlatego jestem taki upierdliwy... Bardzo duzo juz mi pomogles i licze, ze ten ostatni raz tez pomozesz, bo w glebi duszy jestes dobrym czlowiekiem i pomocnym (troche wazeliny nikomu nie zaszkodzilo tongue.gif)

A z ciekawości ile byś wziął za coś takiego? tongue.gif
strife
Cytat(M4rcin3z @ 22.01.2015, 12:56:19 ) *
Nie bede biegac, bo musze zrobic to max do konca czwartku i miec z glowy... Jest to dosc pilny termin, a jeszcze pare innych rzeczy mam do zrobienia :/ Dlatego jestem taki upierdliwy... Bardzo duzo juz mi pomogles i licze, ze ten ostatni raz tez pomozesz, bo w glebi duszy jestes dobrym czlowiekiem i pomocnym (troche wazeliny nikomu nie zaszkodzilo tongue.gif)

A z ciekawości ile byś wziął za coś takiego? tongue.gif


Napisz to na Giełdzie ofert na forum albo na PW to nie jest miejsce na taką konwersację.
A ja polecam, abyś mimo wszystko zacisnął zęby i sam sobie napisał to co chcesz, trochę więcej wiary wink.gif
M4rcin3z
Jak się siedzi nad tym pare dni i nic nie wychodzi to sie szuka pomocy... Wiara w swoje mozliwosci mnie opuscila juz pare dni temu tongue.gif :/
strife
Szukanie pomocy, a oczekiwanie na napisanie gotowca to dwie różne rzeczy.
Tutaj już wiele osób Ci pomogło, teraz jedynie musisz z tej pomocy skorzystać.

Uwierz mi, że jakbyś okazał chociaż odrobinę dobrej woli i zaczął to robić i potem zadawał już konkretne pytania w miejscu gdzie masz problem to już dawno byś to skończył.
Droga na skróty to zapłata komuś za wykonaną pracę - Giełda Ofert.
M4rcin3z
Tylko kolko sie zamyka w momencie kiedy napisalem ze nie moge dalej ruszyc i napisalem wprost co mnie boli to zostalem potraktowany jak nieuk. Nie mowie ze nikt mi nie pomogl, wrecz przeciwnie i nie napisalem ze oczekuje gotowca tylko pomocy jak z tym ruszyc, a podpowiedzi typu poczytaj manuala to troche dziwne wg mnie, bo robie wg manuala i nie idzie..

Dobra wracając do tematu głównego..

Sprawdzając, które dane przesyła $_POST wyświetla mi tylko to:
  1. (
  2. [10] => on
  3. [5] => on
  4. [6] => on
  5. )


Czyli generalnie wysyła tylko ID_Pytania, które było wyświetlone, ale nie pokazuje które ID_Odpowiedzi zostało zaznaczone.

Jakaś podpowiedź jak mogę sprawdzić, które konkretnie ID_Odpowiedzi zostało zaznaczone? Tak dla przypomnienia pytania są losowo generowane razem z przypisanymi do niego odpowiedziami.
Pyton_000
no to do value dla radio wrzuć ID_odpowiedzi, wtedy zamiast 'on' będziesz miał id odpowiedzi
M4rcin3z
Zrobiłem coś takiego:

echo "<input type='radio' name='Odpowiedz[{$pytanie['ID_Pytania']}] value='{$odpowiedzi['ID_Odpowiedzi']}'>{$odpowiedzi['Tresc_Odpowiedzi']}</br>";

Ale dalej wyświetla on a nie ID_Odpowiedzi :/

Albo jestem ślepy albo o czymś nie wiem haha.gif

Jeszcze pytanie czy dobrze rozumuje.....

  1. $sth = $pdo->prepare("SELECT * FROM Odpowiedzi WHERE ID_Pytania IN(".implode(',', $idpytania).")");
  2. $sth->execute();
  3. $odpowiedzi = $sth->fetchAll(PDO::FETCH_ASSOC);


W powyższym kodzie wypisuje wszystkie kolumny w tabeli Odpowiedzi, więc też powinien wypisać mi ten ID_Odpowiedzi w taki sposób jak wpisałem w value?
Pyton_000
Zauważ że są one w tablicy dodatkowoczyli
Kod
array()
[0] -> array(wiersz1),
[1] -> array(wiersz2),
[2] -> array(wiersz3)


Wstaw sobie zamiast FETCH_ASSOC coś takiego:
Kod
PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC

i zobacz co masz dokładnie w odpowiedzi. Wtedy powienieneśmieć tablice z kluczem z id_odpowiedzi i zawartością pozostałych kolumn.
M4rcin3z
A tak z ciekawości muszę jeszcze coś zmodyfikować, bo to co napisałeś żebym wstawił zamiast nic nie dało... Dalej jest to samo :/

Dołożone co napisałeś i dalej jest to samo... Choć "postęp" jest w tym, że wyskakuje komunikat, że
Kod
Notice: Undefined index: ID_Odpowiedzi in C:\xampp\htdocs\EduPortal\bazydanych.php on line 83
i nie mam pomysłu co dalej :/
Pyton_000
A zobaczyłeś choć jaki wynik dostajesz z tego zapytania ?
M4rcin3z
No właśnie miałem pisać, że po dopisaniu tego w ogóle nie wyświetla ID_Odpowiedzi..
Wyświetla coś takiego:

Kod
Array
(
    [6] => Array
        (
            [0] => Array
                (
                    [ID_Pytania] => 6
                    [Tresc_Odpowiedzi] => MySQL
                    [Czy_prawidlowa] => 0
                )

            [1] => Array
                (
                    [ID_Pytania] => 6
                    [Tresc_Odpowiedzi] => PostgreSQL
                    [Czy_prawidlowa] => 0
                )

            [2] => Array
                (
                    [ID_Pytania] => 6
                    [Tresc_Odpowiedzi] => Oracle
                    [Czy_prawidlowa] => 1
                )

            [3] => Array
                (
                    [ID_Pytania] => 6
                    [Tresc_Odpowiedzi] => Firebird
                    [Czy_prawidlowa] => 0
                )

        )
)


A jak wyświetle $przygpytania to już pokazuje ID_Odpowiedzi jako wiersz w tablicy, ale po próbie wyświetlenia wyskakuje error, że niezidentyfikowany index :/

Jestem ciekawy co może być powodem, że nie wyszukuje też ID_Odpowiedzi skoro w zapytaniu do bazy powinny być wyświetlone wszystkie pola tabeli odpowiedzi
Pyton_000
Zmień zapytanie na:
  1. $sth = $pdo->prepare("SELECT ID_Pytania, ID_Opowiedzi, Tresc_Oppowiedzi, Czy_prawidlowa FROM Odpowiedzi WHERE ID_Pytania IN(".implode(',', $idpytania).")");


i pokaż odpowiedź
M4rcin3z
Teraz to wyrzuca przy wyswietlaniu

odpowiedzi
Kod
Notice: Undefined offset: 2 in C:\xampp\htdocs\EduPortal\bazydanych.php on line 86
i
Kod
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\EduPortal\bazydanych.php on line 84


a przy print_r($odpowiedzi) coś takiego:
Kod
Array
(
    [ID_Odpowiedzi] => 28
    [Tresc_Odpowiedzi] => elementy manipulacyjne modelu
    [Czy_prawidlowa] => 0
)


Pyton_000
Pokaż jeszcze raz cały kod
M4rcin3z
Kod
<?php
  // Rozpoczynanie sesji.
session_start();
  
  require_once('config.php');

  
  // Jeśli zmienne sesji nie są ustawione, skrypt próbuje użyć
  // plików cookie.
  if (!isset($_SESSION['nr'])) {
    if (isset($_COOKIE['nr']) && isset($_COOKIE['PESEL'])) {
      $_SESSION['nr'] = $_COOKIE['nr'];
      $_SESSION['PESEL'] = $_COOKIE['PESEL'];
    }
  }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <link rel="stylesheet" type="text/css" href="style.css" />
  <title>Główna strona</title>
</head>
<body>
    <div id="topDiv">
        <div id="headerMainDiv">
            <h3> Bazy danych </h3>
        </div>
        <div id="headerUserInfoDiv">
           <tr>Zalogowany: <?php echo $_SESSION['PESEL']; ?> </tr>
           <tr><a href="logout.php">Wyloguj się</a></tr>
        </div>
        <div id="TestContentDiv">
            <form name="formularz1" action ="result.php" method ="POST">
            <?php    
                $mysql_host = 'localhost';
                $port = '3306';
                $username = 'root';
                $password = '';
                $database = 'quiz';

            try{
                $pdo = new PDO('mysql:host='.$mysql_host.';dbname='.$database.';port='.$port, $username, $password );
            }catch(PDOException $e){
                echo 'Połączenie nie mogło zostać utworzone.<br />';
            }
//Losowe wybieranie pytan
            $sql = "SELECT * FROM pytania ORDER BY RAND() LIMIT 3;";
            $sth = $pdo->prepare($sql);
            $sth->execute();
            
            

            $pytania = $sth->fetchAll(PDO::FETCH_ASSOC);
//Przygotowywanie tablicy z id_pytan
            $idpytania = array();

            foreach ($pytania as $pytanie)
            {
                $idpytania[] = $pytanie['ID_Pytania'];
            }
//Wyszukanie rekordow, ktore zawieraja wybrane ID_Pytania
            $sth = $pdo->prepare("SELECT ID_Pytania, ID_Odpowiedzi, Tresc_Odpowiedzi, Czy_prawidlowa FROM Odpowiedzi WHERE ID_Pytania IN(".implode(',', $idpytania).")");
            $sth->execute();
            $odpowiedzi = $sth->fetchAll(PDO::FETCH_GROUP | PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC);
        
            
            
            $przygpytania = array();
//Tworzenie tablicy z odpowiedziami na wybrane pytania          
            foreach($odpowiedzi as $odpowiedzi)
            {
                $przygpytania[$odpowiedzi['ID_Pytania']][] = $odpowiedzi;              
            }

          
//Tworzenie tablicy z wybranymi pytania oraz powiazanymi poprzez ID_Pytania odpowiedziami oraz ich wyswietlenie
            
            foreach ($pytania as $pytanie)
            {
                echo "<h2>{$pytanie['Tresc_Pytania']}</h2>";
                
            foreach($przygpytania[$pytanie['ID_Pytania']] as $odpowiedzi)
            {
                echo "<input type='radio' name='Odpowiedz[{$pytanie['ID_Pytania']}] value='{$odpowiedzi['ID_Odpowiedzi']}'>{$odpowiedzi['Tresc_Odpowiedzi']}</br>";
            }            
            }
           echo "<input type='submit' value='Zakończ test' name='submit'/>";
          
          
           echo '<pre>';
            print_r($odpowiedzi);
            echo '</pre>';

        ?>
            </form>
        </div>    
    </div>
</body>
</html>


całość
Pyton_000
Masz i analizuj.
  1. $sql = "SELECT * FROM pytania ORDER BY RAND() LIMIT 3;";
  2. $sth = $pdo->prepare($sql);
  3. $sth->execute();
  4. $questions = $sth->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE);
  5.  
  6.  
  7. $sth = $pdo->prepare("SELECT ID_Pytania, ID_Odpowiedzi, Tresc_Odpowiedzi, Czy_prawidlowa FROM Odpowiedzi WHERE ID_Pytania IN(" . implode(',', array_keys($questions)) . ")");
  8. $sth->execute();
  9. $answers = $sth->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC);
  10.  
  11.  
  12. foreach ($questions as $question_id => $question) {
  13. echo "<h2>{$question['Tresc_Pytania']}</h2>";
  14.  
  15. foreach ($answers[$question_id] as $answer) {
  16. echo "<input type=\"radio\" name=\"answer[{$question_id}]\" value=\"{$answer['ID_Odpowiedzi']}\">{$answer['Tresc_Odpowiedzi']}<br>";
  17. }
  18. }
M4rcin3z
Ok przeksztalcone na moje i dziala (bo mialo dzialac tongue.gif) wink.gif

Tylko teraz pytanie nastepujace. Po kliknieciu w przycisk 'zakoncz test' formularz w $_POST wysyla cos takiego

Kod
Array
(
    [answer] => Array
        (
            [5] => 19
            [1] => 2
            [9] => 35
        )

    [submit] => Zakończ test
)


Jak z takiej tablicy mogę pobrać dane i je odrazu sprawdzić, które z tych zaznaczonych odpowiedzi jest poprawnych(czyli czy_prawidlowa = 1 )?

/// edit

Ok domyślam się, że zapytaniem:

"SELECT count(ID_Odpowiedzi) FROM odpowiedzi WHERE ID_Odpowiedzi IN(19,2,35) AND czy_prawidlowa = 1;"

Zliczę ile w zaznaczonych odpowiedziach jest tych prawidlowych. W IN powinny być wtedy ID_Odpowiedzi tylko nie wiem jak je tam wstawić ;/
Pyton_000
implode(',',$_POST['answers'])
M4rcin3z
Coś mi tu nie tak poszło bo wyrzuca

Kod
Catchable fatal error: Object of class PDOStatement could not be converted to string in


a mam coś takiego:

Kod
$sth = $pdo->prepare("SELECT count(ID_Odpowiedzi) FROM odpowiedzi WHERE ID_Odpowiedzi IN (" . implode(',', $_POST['answer'])) . ") AND Czy_prawidlowa = 1";
            $sth->execute();
            $wynik = $sth->fetchAll();
            
            foreach ($wynik as $wyniki) {
                echo $wyniki;
            }


podpowiedz jakas?
Pyton_000
brak ) w prepare.
M4rcin3z
Hula aż miło tongue.gif

Tylko ostatni problem :/

Chciałbym, aby skrypt przerzucił wynik i pare innych danych do bazy tzn.

mam tabele wyniki:

ID_Wyniku (auto increment)
ID_Testu (jest w tabeli pytania)
PESEL (przechowywany w $_SESSION ['PESEL']
Wynik ($wyniki['count(ID_Odpowiedzi)'])
Data (i tutaj chciałbym aby pokazała się bieżąca data DD-MM-RRRR)

wstępnie zrobiłem coś takiego:

Kod
INSERT INTO wyniki (ID_Wyniku, ID_Testu, PESEL, Wynik, Data) VALUES ('','$ID_Testu ','$_SESSION['PESEL']','DATE()','{$wyniki['count(ID_Odpowiedzi)']}')");


Jakaś podpowiedź jak to rozegrać? Co jest źle albo jak to inaczej zrobić?
Pyton_000
A w czym masz problem? Bo to już się zaczyna robić nawet nie śmieszne...
M4rcin3z
Mam problem z tym, że robiąc to w ten sposób:
Kod
$sth = $pdo->prepare("INSERT INTO wyniki (ID_Wyniku, ID_Testu, PESEL, Wynik, Data) VALUES ('','$ID_Testu ','{$_SESSION['PESEL']}','CURDATE()','{$wyniki['count(ID_Odpowiedzi)']}');");
            $sth->execute();
            $wpisy = $sth->fetchAll();


dodaje wynik do bazy, ale wpisuje tylko i wyłącznie w taki sposób:

'1', '0', '85091003652', '0', '0000-00-00'

Czyli dodaje tylko PESEL... i może Ty wiesz czemu.... ?
Pyton_000
Bo pozostałe zmienne nie mają wartości, masz poprzestawiane kolumny z wartościami itp.
M4rcin3z
Wszystko zrobione ! Nie będę już truł d*** tongue.gif




Na koniec chciałem tylko mega podziękować za mega pomoc i wyjaśnienie wielu rzeczy ! Wielkie dzięki Pyton_000 exclamation.gif









sorry za upierdliwość wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.