Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: quiz z użyciem mysql/php - jak to zrobić?
Forum PHP.pl > Forum > Przedszkole
qrzysztof
Witam, mam następujący problem. Chciałbym zrobić quiz, w którym każde pytanie miałoby przynajmniej jedną (ale nie maksymalnie) dobrą odpowiedź).

Na przykład w quizie ze znajomości angielskiego dane mogłyby wyglądać tak:

--------------------------------------------------------------------------
Pytanie: rzucać, Odpowiedź: to throw lub to cast
Pytanie: śpiewać, Odpowiedź: to sing
Pytanie: malować, Odpowiedź: to paint
Pytanie: kupić: Odpowiedź: to buy lub to purchase lub to get
--------------------------------------------------------------------------

Przykład może nieco naciągany, ale chodziło mi tylko o pokazanie idei.

Doszedłem do wniosku, że najlepiej (najefektywniej) będzie przechowywać te dane w bazie w następującej postaci:

ID-----Pytanie-----------Odpowiedź

1------rzucać-------------to throw
2------rzucać-------------to cast
3------śpiewać-----------to sing
4... itd.

Czyli każda kombinacja pytanie/odpowiedź w osobnym rekordzie tej samej tabeli. Według mnie to najlepszy pomysł, ale jako że stawiam pierwsze kroki to bardzo możliwe, że się mylę.

Chciałbym to teraz wyciągnąć z tej tabeli do zmiennej PHP w jakiejś łatwej do obsługi postaci. Najlepiej tak, żeby pytania się nie powtarzały a odpowiedzi nie poginęły.

Bo mogę sobie na przykład zrobić:

Kod
SELECT * FROM tabela


Wtedy pytania będą się powtarzać. Mogę taką tablicę obrobić potem w PHP, ale wydaje mi się to mało efektywne (najlepiej chyba aby jak najwięcej pracowała przy tym baza). Jak z kolei dam:

Kod
SELECT * FROM tabela GROUP by Pytanie


to poginą mi odpowiedzi.

A może w dwóch tabelach to jakoś rozmieścić, porobić jakieś złączenia? Znam już podstawy SQL i PHP, brakuje mi po prostu wyobraźni, jak to najefektywniej "rozegrać". Z góry dzięki za pomoc.
bounty
Tabela może wygladac tak :
tabela pyt_i_odp

Pytanie | Odpowiedz
---------------------------
2+2 | 4
---------------------------
4*5 | 20

W php
Kod
<?php
$q = "SELECT * from pyt_i_odp Where Pytanie='$pytanie' and Odpowiedz = '$odpowiedz'";
$result = mysql_query($q);
if(mysql_fetch_assoc($result)){
echo'odpowiedz poprawna';
} else {
echo'zla odpowiedz !';
}
?>

Oczwiscie aby baza nie zajmowala za duzo mozesz zrobic tabele z id pytania i id odpowiedzi a nastepnie porównac wysylajac w formularzu id zadanego pytania i id opwiedzi nastepnie sprubowac wyciagnac jakis rekord z bazy gdzie id pytania jest równe id odpowiedzi jezeli wyciagnie jakis reekord to odpowiedz jest poprawna
Fifi209
Bez sensu.

Zrób tak:

id
pytanie
odpowiedzi

a odpowiedzi zapisuj tak:
to throw;to cast

Potem tylko explode" title="Zobacz w manualu PHP" target="_manual i in_array" title="Zobacz w manualu PHP" target="_manual
bounty
Jak bez sensu?! Potem tylko w html / php dopisze odpowiedzi jakie chce dodatkowe nie poprwane.
Fifi209
Cytat(bounty @ 25.04.2009, 15:19:32 ) *
Jak bez sensu?! Potem tylko w html / php dopisze odpowiedzi jakie chce dodatkowe nie poprwane.


Jakbyś czytał uważnie to byś wiedział, że może być kilka poprawnych. Poza tym twój sposób to istne marnowanie zasobów serwera (m.in. miejsce na dysku) i marnowanie łącza (w końcu zamiast jednego rekordu dostajesz np. 4)

mała poprawka co do mojego pomysłu

Pola w bazie:

id pytanie odpowiedzi poprawne

i zapisujesz dany rekord jako

1 Czy mleko jest dobre? tak;bardzo;nie 1;1;0

Wartość tak odpowiada 1
Wartość bardzo odpowiada 1
Wartość nie odpowiada 0

1 - poprawnie
0 - źle

Mam nadzieję, że złapiesz. haha.gif
bounty
No tak nie doczytałem tongue.gif
Mój pomysł.
Pytanie | Odpowiedzi poprawne
Co lubie | Jeść;Grać

  1. <?php
  2. $q = "SELECT Pytanie,Odpowiedzi from quiz where Pytanie='$pytanie' and Opdpwiedz LIKE '%$odpowiedz%'";
  3. ?>

Oczywiście odpiedz nie bedzie wpisywana recznie (Bo może np wpisać p i bedzie ok) tylko wybierana checkboxami.
qrzysztof
Dzięki za odpowiedzi.

Pomysł fifi209 na razie najbardziej do mnie przemawia. Jest na pewno dużo bliższy optimum (a może nawet jest optymalny - mam za małą wiedzę praktyczną żeby to w 100% stwierdzić).

Co do ; i explode to nie napisałem w pierwszym poście, że będzie jeszcze edytor tych quizów gdzie użytkownik będzie wpisywał pytania i odpowiedzi. Tu może pojawić się problem z wrażliwością na ten znak oddzielający ( ; ) ale myślę, że będzie stosunkowo łatwy w obejściu.

W uzupełnieniu napiszę jeszcze z grubsza jak to wszystko miało w zamyśle wyglądać żeby dać Wam jakieś pojęcie. Sporą część mam już zresztą oprogramowaną - chciałem po prostu pomysłu na optymalne rozwiązanie na linii baza/php.

Tak więc mamy edytor tych quizów gdzie użytkownik może dodawać pytanie i odpowiedź do niego (domyślnie jedną, ale opcjonalnie więcej). Pomijam tu już identyfikatory poszczególnych quizów, tworzenie quizów itd - bo to w tym miejscu nieistotne i nie mam z tym problemu.

Następnie użytkownik może "zagrać" w taki quiz. I nie wiem czy quiz to dobre słowo, bo nie jest to typowy test wyboru tylko wyświetla się pytanie i trzeba wpisać odpowiedź. Tak więc w bazie chce przechowywać tylko pytanie + poprawną odpowiedź (odpowiedzi). Użytkownik wpisuje swoją i skrypt je porównuje.

A jeszcze bardziej szczegółowo wygląda to tak, że
1) użytkownik wybiera quiz,
2) skrypt łączy się z bazą i na podstawie id quizu wybiera id-y pytań (które są zapisywane w tablicy)
3) w trakcie grania w quiz z tablicy pobierany jest id pytania (metodą array_pop())
4) na postawie id pytania pobierana jest z bazy treść pytania i odpowiedź (odpowiedzi)

I właśnie w punkcie 4 pojawia się ten problem. Bo na razie mam to dla pojedynczej odpowiedzi i chciałbym zmienić na parę możliwych (ale nie jest to test wyboru, tylko otwarty!)

Jeśli po tym uzupełnieniu coś Wam się jeszcze nasuwa to podzielcie się swoimi uwagami.
Fifi209
Cytat(qrzysztof @ 25.04.2009, 16:59:56 ) *
Co do ; i explode to nie napisałem w pierwszym poście, że będzie jeszcze edytor tych quizów gdzie użytkownik będzie wpisywał pytania i odpowiedzi. Tu może pojawić się problem z wrażliwością na ten znak oddzielający ( ; ) ale myślę, że będzie stosunkowo łatwy w obejściu.

Jeśli po tym uzupełnieniu coś Wam się jeszcze nasuwa to podzielcie się swoimi uwagami.


Odbierasz dane od użytkownika i zapisujesz np.

Kod
$zmienna = $_POST['pierwszy'].';'.$_POST['drugi'];


Obok jeszcze czy to poprawna odpowiedź czy nie, za pomocą checkbox'ów.

@topic

Pomysł z like jest jak najbardziej nieudany. winksmiley.jpg Przy udzielaniu odpowiedzi dostarczaj skryptowi id pytania i niech ten pobierze odpowiedzi i jest exploduje i następnie wyszuka za pomocą in_array" title="Zobacz w manualu PHP" target="_manual
qrzysztof
Cytat(fifi209 @ 25.04.2009, 17:09:11 ) *
Odbierasz dane od użytkownika i zapisujesz np.

Kod
$zmienna = $_POST['pierwszy'].';'.$_POST['drugi'];


Obok jeszcze czy to poprawna odpowiedź czy nie, za pomocą checkbox'ów.


Z tą wrażliwością na ; chodziło mi o to co się stanie jeśli w edytorze w podanej odpowiedzi znajdzie się ten znak (teoretycznie jest taka możliwość, bo tematyka quizów ma być różnoraka) - wtedy może to "rozwalić" tablicę odpowiedzi.

A checkboxy są niepotrzebne bo użytkownik podaje tylko poprawne odpowiedzi (test otwarty, nie wyboru).

---------------
W sumie fifi rozwiązał już 95% mojego problemu. Pozostaje tylko kwestia, jak zrobić ten zapis do bazy + explode tak, aby zminimalizować (albo najlepiej uniknąć w ogóle) błędu przy wprowadzeniu przez użytkownika do odpowiedzi (na etapie edycji) krytycznego znaku (tego, którego używamy w bazie do rozdzielenia odpowiedzi i w explode).

Średnik wydaje mi się jednak zbyt popularny. Może | lepiej? Albo znak tabulacji/entera. Tu też jednak może być pewna wrażliwość jeśli ktoś wpisze np \t a o to nie wiem czy nie łatwiej niż o średnik. Zastanawiam się jak to obejść...

A może po prostu tu nie ma łatwego i mało obciążającego obejścia i najlepiej zostawić tę małą dziurę w kodzie?
bounty
Cytat
A checkboxy są niepotrzebne bo użytkownik podaje tylko poprawne odpowiedzi (test otwarty, nie wyboru).

A co jeżeli odpowiedz w bazie będzie np Kupa o osoba wpisze kupa porównanie za pomacą = nie zwróci żadnego rekordu czyli odpowiedz jest zła.
qrzysztof
To już mam oprogramowane. Domyślnie odpowiedzi są porównywane bez uwzględnienia wielkości znaków. Jest opcja, po włączeniu której wielkość liter nabiera znaczenia.

W tym pierwszym przypadku, w podanym przez Ciebie przykładzie wyświetliłby się komunikat "Poprawna odpowiedź". Natomiast w tym drugim (z włączoną opcją) - "Błędna odpowiedź", bo wyrazy różnią się wielkością liter.
bear007
też się teraz z tym męczę skończeś moze ten projekt? Byś się podzielił?
Póki co eksperymentuje z takimi kreatorami internetowymi np. funtest.pl jest albo taki kreator http://www.quizz.pl/addQuizForm2.php, on pozwala osadzać quiz na stronie.

Ale i tak bym chciał napisać w MySQL i PHP. Please pomocy!!
celbarowicz
Kiedyś ktoś pytał o quiz, rozpoczętą pracę można obejrzeć na poznam4.yoyo.pl. Quiz nie jest dokończony ,gdyż klient uważał,że ktoś będzie pracował za friko.
Opracowane jest jedynie to co widać oraz wprowadzanie: nazwy quizu-ilości pytań i ilości podpunktów. Wyświetlanie pozostałych części skryptu trzeba dopracować.
Zapraszam do testowania.
Ghostbusters
No właśnie. Jak to zrobić, żeby Quiz wyglądał tak:

Zaznacz, prawidłową odpowiedź:

snore
  • iśc
  • chrapać
  • jem



Słowo snore i chrapać to ten sam rekord, natomiast pozostałe słowa (rekordy) ładowane losowo.

Tabela ma postać: ID, słowo_po_angielski, słowo_po_polsku.

Moje pytanie zatem brzemi.

Jak pobrać to za pomocą formulaża, żeby po kliknięciu na odpowiednie słowo (Bez dodatkowych buttonów Submit!), formulaż potrafił porównać te dwa rekordy i wyswietlił komunikat:

If (OK!)
echo Dobra odpowiedź
else
echo Prawidłowa odpowiedź to: chrapać

I załadował następne słowa i tak w kóło.

CZyli taki jakby Ajaksowy quiz.


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.