Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> quiz z użyciem mysql/php - jak to zrobić?
qrzysztof
post
Post #1





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


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.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
bounty
post
Post #2





Grupa: Zarejestrowani
Postów: 68
Pomógł: 9
Dołączył: 12.04.2009
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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

Ten post edytował bounty 25.04.2009, 13:30:30


--------------------
<?php
while($earth){
drop_bomb();
}
?>
Go to the top of the page
+Quote Post
Fifi209
post
Post #3





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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

Ten post edytował fifi209 25.04.2009, 13:46:31


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
bounty
post
Post #4





Grupa: Zarejestrowani
Postów: 68
Pomógł: 9
Dołączył: 12.04.2009
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


Jak bez sensu?! Potem tylko w html / php dopisze odpowiedzi jakie chce dodatkowe nie poprwane.


--------------------
<?php
while($earth){
drop_bomb();
}
?>
Go to the top of the page
+Quote Post
Fifi209
post
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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

Ten post edytował fifi209 25.04.2009, 14:28:27


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
bounty
post
Post #6





Grupa: Zarejestrowani
Postów: 68
Pomógł: 9
Dołączył: 12.04.2009
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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.


--------------------
<?php
while($earth){
drop_bomb();
}
?>
Go to the top of the page
+Quote Post
qrzysztof
post
Post #7





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


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.

Ten post edytował qrzysztof 25.04.2009, 16:07:10


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
Fifi209
post
Post #8





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
qrzysztof
post
Post #9





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


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?

Ten post edytował qrzysztof 25.04.2009, 18:29:43


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
bounty
post
Post #10





Grupa: Zarejestrowani
Postów: 68
Pomógł: 9
Dołączył: 12.04.2009
Skąd: Wrocław

Ostrzeżenie: (10%)
X----


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.


--------------------
<?php
while($earth){
drop_bomb();
}
?>
Go to the top of the page
+Quote Post
qrzysztof
post
Post #11





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


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.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
bear007
post
Post #12





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 10.06.2005

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


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!!
Go to the top of the page
+Quote Post
celbarowicz
post
Post #13





Grupa: Zarejestrowani
Postów: 253
Pomógł: 31
Dołączył: 30.03.2009
Skąd: Szczecin

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


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.
Go to the top of the page
+Quote Post
Ghostbusters
post
Post #14





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 31.12.2014

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


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.


Go to the top of the page
+Quote Post

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: 20.08.2025 - 18:24