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:
<?php // Pobieramy wybrany przez użytkownika poziom trudności cytatu $ido = (int)$_GET['poziom']; // Jeśli wybrano poziom trudności, ustalamy jego nazwę if($ido == 1) $poziomtrudnosci = "Łatwy"; else if($ido == 2) $poziomtrudnosci = "Średni"; else if($ido == 3) $poziomtrudnosci = "Trudny"; else if($ido == 4) $poziomtrudnosci = "Cała baza"; else $poziomtrudnosci = "Nie wybrano"; // Sprawdzamy czy użytkownik rozpoczyna dopiero test czy jest już w jego trakcie if($ido == NULL) { // Tworzymy podstawowe wartości dla użytkownika, który zaczyna test $button = ""; $cytat = "Wybierz poziom trudności aby rozpocząć!"; } else { // Jeżeli wybrano całą bazę, losujemy ją if($ido == 4) { // Losujemy poziom trudności } else { // Ustawiamy poziom trudności taki jak wybrano w formularzu $wylosowanabaza = $ido; } // Sprawdzamy, który stopień trudności cytatów wybrano if($ido == 1 or $ido == 2 or $ido == 3) { // Ustalamy bazę danych, którą wybieramy $bazadanych = "cytaty$wylosowanabaza"; // Połączenie z baza danych MySQL include("polaczenie.php"); // Pobieranie najwyższego ID $pobierzID = "SELECT ID FROM $bazadanych WHERE ID > 0 ORDER BY ID DESC"; // Ustalamy zakres losowanego ID $minID = 1; $maxID = $wierszID[0]; // Losujemy ID // Pobieranie pola test użytkownika z bazy danych $pobierzpoletest = "SELECT test FROM uzytkownicy WHERE ID = $id"; // Ustalamy nazwę dla naszej zmiennej $uzytecytaty = "$wierszpoletest[0]"; // Ustalamy formę dla wybranego ID na podstawie poziomu trudności if($ido == 1) $kod = "L"; else if($ido == 2) $kod = "S"; else if($ido == 3) $kod = "T"; else $kod = ""; // Tworzymy kod $calykod = "$kod$wylosowanyID"; if($lancuch === false) { } else { do { // Losujemy kolejne ID $calykod = "$kod$wylosowanyID"; } } // Pobranie danych użytkownika $szukaj = "SELECT ID, tresc, skrot, ksiega, skrot2, ksiega2 FROM $bazadanych WHERE ID = '$wylosowanyID'"; // Zakończenie połączenia z bazą danych // Tworzymy button dla użytkownika, który jest w trakcie testu $button = "<a href=\"index.php?strona=sprawdz-odpowiedz&poziom=$ido&pytanie=$wiersz[0]&odp=a\"><button class=\"button-odpowiedz\" type=\"button\">$wiersz[3] ($wiersz[2])</button></a><a href=\"index.php?strona=sprawdz-odpowiedz&poziom=$ido&pytanie=$wiersz[0]&odp=b\"><button style=\"margin-left: 2px;\" class=\"button-odpowiedz\" type=\"button\">$wiersz[5] ($wiersz[4])</button></a>"; // Pobieramy cytat $cytat = "<span style=\"font-weight: bold; \">„$wiersz[1]”</span><br />"; } // OD TEGO MIEJSCA SKRYPT JEST TECHNICZNYM ZARYSEM, DORZUCIŁEM GO JEDYNIE ABY OSOBY, KTÓRE ZERKNĄ NA SKRYPT NIE MUSIAŁY MI PISAĆ, ŻE BRAKUJE TEJ CZĘŚCI else if($ido == 4) { // Ustalamy bazę danych, którą wybieramy $bazadanych = "cytaty$wylosowanabaza"; // Połączenie z baza danych MySQL include("polaczenie.php"); // Pobieranie najwyższego ID $pobierzID = "SELECT ID FROM $bazadanych WHERE ID > 0 ORDER BY ID DESC"; // Ustalamy zakres losowanego ID $minID = 1; $maxID = $wierszID[0]; // Losujemy ID // Pobranie danych użytkownika $szukaj = "SELECT ID, tresc, skrot, ksiega, skrot2, ksiega2 FROM $bazadanych WHERE ID = '$wylosowanyID'"; // Zakończenie połączenia z bazą danych // Tworzymy button dla użytkownika, który jest w trakcie testu $button = "<a href=\"index.php?strona=sprawdz-odpowiedz&poziom=$ido&pytanie=$wiersz[0]&odp=a\"><button class=\"button-odpowiedz\" type=\"button\">$wiersz[3] ($wiersz[2])</button></a><a href=\"index.php?strona=sprawdz-odpowiedz&poziom=$ido&pytanie=$wiersz[0]&odp=b\"><button style=\"margin-left: 2px;\" class=\"button-odpowiedz\" type=\"button\">$wiersz[5] ($wiersz[4])</button></a>"; // Pobieramy cytat $cytat = "<span style=\"font-weight: bold; \">„$wiersz[1]”</span><br />"; } else { // Nie wybrano jeszcze poziomu trudności } } ?>
Problem wygląda następująco i dotyczy tego kawałka kodu:
// Tworzymy kod $calykod = "$kod$wylosowanyID"; if($lancuch === false) { } else { do { // Losujemy kolejne ID $calykod = "$kod$wylosowanyID"; } } // Pobranie danych użytkownika $szukaj = "SELECT ID, tresc, skrot, ksiega, skrot2, ksiega2 FROM $bazadanych WHERE ID = '$wylosowanyID'"; // Zakończenie połączenia z bazą danych // Tworzymy button dla użytkownika, który jest w trakcie testu $button = "<a href=\"index.php?strona=sprawdz-odpowiedz&poziom=$ido&pytanie=$wiersz[0]&odp=a\"><button class=\"button-odpowiedz\" type=\"button\">$wiersz[3] ($wiersz[2])</button></a><a href=\"index.php?strona=sprawdz-odpowiedz&poziom=$ido&pytanie=$wiersz[0]&odp=b\"><button style=\"margin-left: 2px;\" class=\"button-odpowiedz\" type=\"button\">$wiersz[5] ($wiersz[4])</button></a>"; // Pobieramy cytat $cytat = "<span style=\"font-weight: bold; \">„$wiersz[1]”</span><br />";
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