![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Cześć wszystkim,
Tworzę sobie projekt w którym jedną z funkcji jest system losowania cytatów (taki quiz). Poniższy skrypt działa w sumie w 85% w takim stopniu w jakim chciałbym aby działał, jednakże brakuje tych najistotniejszych 15%. 1. Użytkownik wybiera poziom trudności 2. Biorąc pod uwagę wybrany poziom (lub brak) wyświetla treści adekwatne do wybranego 3. Projekt opiera się o 3 tabele w bazie danych, które posiadają cytaty o trzech stopniach trudności. W przypadku wybrania poziomu łatwego (1 baza) wskazuje nam tylko cytaty z pierwszej bazy itd. W przypadku wybrania całej bazy, system losuje jedną z trzech baz. Teraz chciałbym przejść do problemu, który napotkałem (jestem samoukiem, stąd chciałbym poradzić się u bardziej doświadczonych osób ). Na wstępie podam skrypt/kod (prędzej jest tylko wyciągnięcie numeru id/loginu użytkownika z sesji, co nie ma wpływu na zaistniały problem:
Problem wygląda następująco i dotyczy tego kawałka kodu:
Kod, który wylosuje ID, sprawdza za pomocą funkcji strstr() czy występuje dany cytat w bazie danych użytkownika (czy został już użyty - każdy użyty jest zapisywany w tabeli użytkowników w polu "test", przyjmuje on formę np. L3, L10, L100 itd. co oznacza L - łatwy, 100 numer ID). W momencie kiedy mamy do wyboru np. trzy cytaty w bazie danych o stopniu łatwym i tylko ta baza została wybrana, dwa z nich zostały użyte, czyli znajdują się już w zmiennej $uzytecytaty, system poprawnie losuje 3 cytat, który pozostał w bazie danych i nie był użyty w quizie. Problem pojawia się, kiedy każdy z cytatów został wykorzystany dla wybranego poziomu trudności, wtedy pętla wpada w nieskończoną. Próbowałem opcji break, endwhile niestety nic z tego nie zadziałało w sposób, który byłby rozwiązaniem tego problemu. W związku z tym, że programistą nie jestem i robię to jako pasję (po prostu uczę się - dlatego też do Was napisałem), domyślam się, że problem może leżeć w konstrukcji pętli, może formie, wyborze rodzaju pętli. Chciałbym poprosić o pomoc w rozwiązaniu mojego problemu. Za każdą z odpowiedzi będę bardzo wdzięczny. Pozdrawiam Piotr |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Po pierwsze nie myl pojec:
tabela baza danych Po drugie: twoje cytaty maja byc w jednej tabeli, ktora dodatkowo bedzie mialo pole: POZIOM I wszystko nagle staje sie latwiejsze -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Pierwotnie tak była skonstruowana baza. Podpowiedz zatem w jaki sposób wyodrębnić min i max dla konkretnego poziomu.
Zakładając Twój pomysł z polem "poziom". Jak ustalić minimalną i maksymalną wszystkich cytatów dla poziomu danego przy założeniu, że: 1 | Cytat | Łatwy 2 | Cytat | Średni 3 | Cytat | Średni 4 | Cytat | Trudny 5 | Cytat | Łatwy 6 | Cytat | Trudny 7 | Cytat | Łatwy 8 | Cytat | Łatwy 9 | Cytat | Trudny 10 | Cytat | Średni Oczywiście nie jest to forma, jedynie przykład. Albo w przypadku kiedy byłaby baza ale każdy cytat byłby o jednakowym stopniu trudności. Biorąc pod uwagę pętlę do while, którą użyłem w jaki sposób zmienić jej konstrukcje (lub zastosować inną może), która wykona tą samą funkcję ale w przypadku wylosowania wszystkich możliwych cytatów, zwróci komunikat: Wylosowano już wszystkie dostępne cytaty, koniec gry. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Masz jeszcze skopana tabele z cytatami, ktore user juz widzial. ma byc tabela:
USER_CYTAT z polami: ID_USER, ID_CYTAT Potem losowanie jest juz banalne: select * from CYTATY where ID not in (SELECT ID_CYTAT from USER_CYTAT where ID_USER=id_usera) order by rand() limit 3 To tylko szybki szkic. Oczywiscie musi dojsc warunek na poziom itp ale idea bedzie wlasnia taka. Mozna jeszcze usprawnic losowanie bo order by rand() do optymalnych nie nalezy. -------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 15 Pomógł: 0 Dołączył: 25.11.2009 Ostrzeżenie: (0%) ![]() ![]() |
Okej, dzięki za podpowiedź, wieczorem pewnie zajmę się i spróbuje ponownie przerobić bazę.
Mam jeszcze zapytanie odnośnie pętli, której użyłem. Co w niej jest nie tak i jak mogłaby ona wyglądać aby spełniła swoją funkcję (jak już coś robię to na przyszłość być może się przyda ta wiedza). |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Nie chce mi sie analizowac tej calej sieczki, no ale jak nie ma juz nic do wylosowania to sie zapetlasz. Musisz sprawdzic czy jest cos do losowania czy nie i jak nie to robic break.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 10:03 |