Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Pobieranie pytania i odpowiedzi dla testu
Forum PHP.pl > Forum > Przedszkole
niewytancze
Tworzę prosty skrypt z testem wypisującym pytania wraz z kilkoma wariantami odpowiedzi, z czego jedna jest poprawna.

Struktura tabel w MYSQL wygląda następująco:

Tabela testy:

id
nazwa
data
czas_trwania
suma_pytan
aktywacja

----------------

Tabela pytania:

id
id_testu
tresc_pytania
ilosc_odpowiedzi

----------------

Tabela odpowiedzi:

id
id_pytania
id_testu
odpowiedz
poprawna

Problem pojawia się w momencie wypisywania pytania w z przyporządkowanymi do niego odpowiedziami.

  1. SELECT tresc_pytania, odpowiedz
  2. FROM pytania, odpowiedzi
  3. WHERE pytania.id = odpowiedzi.id_pytania
  4. AND pytania.id_testu = odpowiedzi.id_testu
  5. AND odpowiedzi.id_testu =110


Daje to wynik:

tresc_pytania odpowiedz
pytanie1 ala2
pytanie1 ala1
pytanie2 kija 1
pytanie2 kija 2
pytanie3 er4
pytanie3 er3
pytanie3 2
pytanie3 1

Oczywiście podczas wypisywania na stronie w {section}, pytanie przy każdej odpowiedzi dubluje się. Natomiast ja chciałbym uzyskać taki efekt:

1. pytanie1

odp1
odp2
odp3

2. pytanie2

itd.

Próbowałem już z joinem, grupowaniem (wypisywało tylko jedną odp. dla każdego pytania), zapytaniami zagębionymi i wieloma innymi sposobami nie osiągając zamierzanego celu.
Proszę o pomoc smile.gif

peter13135
A co stoi na przeszkodzie, jak dostajesz wynik w takiej formie ? Przecież masz wszystkie dane które Ci potrzebne, tylko za pomocą PHP zrobić filtrowanie, czy tam wyświetlanie tego co Ci potrzebne.
niewytancze
Tego też próbowałem, kombinowałem z for'em i innymi niestety nie udało się sad.gif

Mam wszystko w jednej tabeli:

  1. $query="SELECT tresc_pytania, odpowiedz
  2. FROM pytania, odpowiedzi
  3. WHERE pytania.id = odpowiedzi.id_pytania
  4. AND pytania.id_testu = odpowiedzi.id_testu
  5. AND odpowiedzi.id_testu =110";
  6. $rs=$db->GetArray($query);
  7.  
  8.  
  9. $smarty->assign('pytania_i_odp', $rs);
  10.  


  1. {section name=i loop=$pytania_i_odp}
  2. {$pytania_i_odp[i].tresc_pytania}
  3. {$pytania_i_odp[i].odpowiedz}
  4. {/section}
peter13135
po 6 linijce daj takie coś
  1. $newRs = array();
  2. foreach($rs as $v)
  3. {
  4. $newRs[$v['tresc_pytania']][] = $v['odpowiedz'] ;
  5. }
  6.  

do templatki dajesz $newRs zamiast $rs
Kod
{foreach from=$pytania_i_odpowiedzi item = m}
Pytanie : {key($m)} <br />
{foreach from=$m item = n}
  {$n} <br />
{/foreach}
{/foreach}



Tak proponuję, nie wiem czy czegoś nie przekombinowałem.
d3ut3r
  1. SELECT a.tresc_pytania,GROUP_CONCAT(b.odpowiedz) AS odpowiedzi FROM pytania AS a
  2. LEFT JOIN odpowiedzi AS b ON a.id=b.idp


takie zapytanie zwróci Ci:

treść pytania | odpowiedź A,odpowiedź B, odpowiedź C

później w PHP za pomocą explode możesz to rozbić do tablicy.
peter13135
też myślałem o tym rozwiązaniu... ale co jeśli pytanie zawiera przecinek ? tongue.gif
d3ut3r
Można tak:

  1. GROUP_CONCAT(b.odpowiedzi SEPARATOR '###')


smile.gif
niewytancze
Dziękuję wam serdecznie za pomoc i wskazówki wink.gif

Wykorzystałem to co zaproponował peter13135 i po drobnej zmianie:

  1. {foreach from=$pytania_i_odpowiedzi key=k item = m}
  2. {$k} <br />
  3. {foreach from=$m item = n}
  4. {$n} <br />
  5. {/foreach}
  6. <br />
  7. {/foreach}


wszystko wyświetla się tak jak chciałem. (klikam pomógł bo się należy tongue.gif)
Pozdrawiam
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.