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:
<?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
$wylosowanabaza = rand(1
, 3
); }
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
$wylosowanyID = rand($minID, $maxID);
// 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";
$lancuch = strstr($uzytecytaty, $calykod);
if($lancuch === false)
{
echo("Pokazuje cytat, którego nie było"); }
else
{
do
{
// Losujemy kolejne ID
$wylosowanyID = rand($minID, $maxID);
$calykod = "$kod$wylosowanyID";
$lancuch = strstr($uzytecytaty, $calykod); }
while(strstr($uzytecytaty, $calykod)); echo("Wylosowano nowy cytat!"); }
// 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
$wylosowanyID = rand($minID, $maxID);
// 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";
$lancuch = strstr($uzytecytaty, $calykod);
if($lancuch === false)
{
echo("Pokazuje cytat, którego nie było"); }
else
{
do
{
// Losujemy kolejne ID
$wylosowanyID = rand($minID, $maxID);
$calykod = "$kod$wylosowanyID";
$lancuch = strstr($uzytecytaty, $calykod); }
while(strstr($uzytecytaty, $calykod)); echo("Wylosowano nowy cytat!"); }
// 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