Wątek przeniesiony 2018-08-20 10:25 z Webmastering przez Patryk27.

Dlaczego wyswietla unexpected else?

0

Udalo mi sie to naprawic, probuje pojsc dalej i kolejny napotkany moj problem to jak zliczyc ilosc rekordow dla danego uzytkownika.
Zrobilem tabele w ktorej gracz rejestruje sie wciskajac przycisk i owszem dodaje go bez problemu, lecz jak teraz zrobic aby mogl dodac sie np tylko 3 razy?



// System zliczania ilosci rekordow i dodawanie do bazy jesli jest mniej niz 6 uzytkownikow
$zliczanierekordow = "SELECT COUNT(userID) FROM tbl_mikrolosik6";
$ile = $user_home->runQuery($zliczanierekordow);
$ile->execute();
$tablica = $ile->fetch(PDO::FETCH_ASSOC);
foreach($tablica as $row1)
// System zliczania ile razy uzytkownik juz sie zarejestrowal, jesli wiecej niz raz wyswietla komunikat
$ilerazy = "SELECT * FROM tbl_mikrolosik6";
$ile = $user_home->runQuery($ilerazy);
$ile->execute();
$tablica1 = $ile->fetch(PDO::FETCH_ASSOC);
foreach($tablica1 as $row2)
// Dodanie uzytkownika do turnieju jesli jest mniej niz 6 rekordow
if ($row1 < 6) {
    if ($row2 < 1)
        {
        $dodajgracza = "INSERT INTO tbl_mikrolosik6(userID) VALUES(".$row['userID'].")";
        $dodajgracza1 = $user_home->runQuery($dodajgracza);
        $dodajgracza1->execute();
        echo 'Zarejestrowales sie!<br/>Wroc do gier i czekaj az wystartuje turniej!';
        } else {
        echo 'Zarejestrowales sie juz!';
        } 
    else 
    { echo 'Osiagnieto limit uzytkownikow!<br/>Sprobuj ponownie gdy liczba zarejestrowanych graczy bedzie ponizej 6!'
}
}

Jesli jest mniej niz 6 rekordow w bazie i jesli uzytkownik jest zarejestrowany mniej niz 1 czyli wcale to dodaj go. Jesli jest wiecej niz 6 to wywal komunikat osiagnieto limit uzytkownikow a jesli jest juz zarejestrowany raz to wywal komunikat ze sie juz zarejestrowal raz i wystarczy. Dlaczego wyswietla unexpected else?

1

Powoli, powoli - na początku skupmy się na tym fragmencie:

foreach($tablica as $row1)
$ilerazy = "SELECT * FROM tbl_mikrolosik6";
$ile = $user_home->runQuery($ilerazy);

Prawidłowo sformatowany, ten kod będzie wyglądał i działał tak:

foreach ($tablica as $row1) {
  $ilerazy = "SELECT * FROM tbl_mikrolosik6";
}

$ile = $user_home->runQuery($ilerazy);

Widzisz pierwszy błąd?

To teraz popraw formatowanie w reszcie kodu i nigdy nie pomijaj dodawania klamerek przy ifach, foreachach itd.

0

Troszke nie rozumiem aczkolwiek widze ze faktycznie klamry nie mam ani jednej po foreach

moze inaczej to wytlumacze jeszce raz od poczatku..

Chcialbym aby uzytkownik po kliknieciu przycisku z innej strony o nazwie "Zarejestruj sie" przenosilo go do tego pliku i tutaj sprawdzamy czy moze sie zarejestrowac. Czyli najpierw chcialbym sprawdzic czy ma on w ogóle kupiony bilet zeby mogl sie zarejestrowac -> jesli tak to puszczamy dalej, jesli nie to wyswietla komunikat ze nie ma biletu. Potem sprawdzamy czy ilosc uzytkownikow zarejestrowanych przekracza liczbe 6 (bo tyle ma byc w turnieju), jesli nie ma to rejestrujemy i dodajemy rekord do bazy, a jesli jest 6 to wyswietla komunikat ze jest pelny turniej i nie mozna sie juz zarejestrowac. Pozniej kolejna rzecza wypadaloby sprawdzic czy uzytkownik ten zarejestrowal sie juz wczesniej aby nie bylo sytuacji ze 2x lub wiecej rejestruje sie ten sam gosc. Jesli nie ma go w tej tabeli to puszczamy a jesli jest to wyswietla komunikat ze juz sie zarejestrowal.

0

Popraw kod tak, aby wszędzie były wykorzystane klarmy i aby był on poprawnie sformatowany (wpisz w Google php code formatting), potem możemy zacząć szukać dalszych błędów.

0

No wiec tak, po kolei najpierw zliczamy ile jest rekordow w bazie i wyswietlamy komunikaty, jesli jest 6 rekordow to wyswietla komunikat ze jest maksymalna ilosc graczy, jesli mniej to wyswietla komunikat ile aktualnie jest zarejestrowanych

// System zliczania ilosci rekordow
$zliczanierekordow = "SELECT COUNT(userID) FROM tbl_mikrolosik6";
$ile = $user_home->runQuery($zliczanierekordow);
$ile->execute();
$tablica = $ile->fetch(PDO::FETCH_ASSOC);
// Wyswietlenie komunikatu ile graczy jest zarejestrowanych badz komunikat ze jest maksymalna ilosc graczy i nie mozna sie zarejestrowac
foreach ($tablica as $row1) 
{
	if ($row1>= 6) {
	echo 'Jest juz maksymalna ilosc graczy wiec nie mozesz sie zarejestrowac';	
	} else {
	echo 'Jest zarejestrowanych:'.$row1.' graczy, wiec mozesz sie jeszcze zarejestrowac';
	}
}

To jest chyba wporzadku prawda?

0

Tak, ten kod wygląda bardziej znośnie - w dalszym ciągu jednak:

  1. W jakim celu utworzyłeś zmienną $zliczanierekordow? Nie mogłeś od razu zrobić $user_home->runQuery('SELECT count(...)');?

  2. Dlaczego Twoja zmienna udostępniająca połączenie do bazy nazywa się $user_home, a nie po prostu $db?

  3. Skoro pobierasz z bazy jeden wiersz, dlaczego wykorzystujesz foreach?

0

W tabeli mikrolosik6 jest tylko jedna kolumna o nazwie userID wiec w sumie moglbym to zrobic inaczej z tym ze nie wiem jak sie za to zabrac sprobowalem tej opcji.
Uzylem $user_home poniewaz tak wczesniej bylo zrobione przy polaczeniu, nie probowalem ze zmienna $db
Jak zrobic aby nie bylo tego foreach?

0

Ja widziałbym to tak:

$numberOfUsersStmt = $db->runQuery('SELECT count(*) AS number_of_users FROM tbl_mikrolosik6'); // @note dlaczego tabela nazywa się "tbl_mikrolosik6", a nie "users"?
$numberOfUsersStmt->execute();

$numberOfUsers = $numberOfUsersStmt->fetch(PDO::FETCH_ASSOC)['number_of_users'];
0

Tabela nazywa sie tak poniewaz sa dwie tabele, w pierwszej mamy wszystkich uzytkownikow nazywa sie ona tbl_users, a w tej tabeli chce miec po prostu grupke 6 osob ktorzy klikna przycisk zarejestruj.

0

Dobra udalo mi sie ogarnac moment rejestracji tylko teraz musze to polaczyc i wrzucic ify sprawdzajace.

// System zliczania ilosci rekordow w tabeli tbl_mikrolosik6
$ile = $user_home->runQuery("SELECT COUNT(userID) FROM tbl_mikrolosik6");
$ile->execute();
$tablica = $ile->fetch(PDO::FETCH_ASSOC);
foreach ($tablica as $row1) {
// Instrunkcja warunkowa, jesli jest mniej niz 6 uzytkownikow dodajemy do bazy i piszemy komunikat ze sie zarejestrowal
	if ($row1 >= 6) {
	echo 'Jest juz maksymalna ilosc graczy wiec nie mozesz sie zarejestrowac';	
	} else {
	echo 'Zarejestrowales sie, wroc do gier i czekaj na rozpoczecie turnieju';
		$dodajgracza = "INSERT INTO tbl_mikrolosik6(userID) VALUES(".$row['userID'].")";
		$dodajgracza1 = $user_home->runQuery($dodajgracza);
		$dodajgracza1->execute();
	}
}

Jak zrobic to drugie sprawdzenie aby system sprawdzil czy uzytkownik raz sie juz zarejestrowal i jesli tak to zeby wrzucil komunikat ze nie moze wiecej razy?

0

Powoli, powoli - teraz powydzielaj kod do funkcji tak, aby całość wyglądała tak:

function getNumberOfRegisteredUsers(): int {
  /* tutaj magia */
}

function registerUser(int $userId): void {
  /* tutaj magia */
}

if (getNumberOfRegisteredUsers() <= 6) {
  echo 'Jest juz maksymalna ilosc graczy wiec nie mozesz sie zarejestrowac';  
} else {
  registerUser($userId);
  echo 'Zarejestrowales sie, wroc do gier i czekaj na rozpoczecie turnieju';
}
0

Uh pokrecone to za bardzo... Potrzebne mi teraz tylko polaczyc te ify sprawdzajace i wszystko by dzialalo tak jak trzeba tak mi sie wydaje. Nie moge ogarnac teraz tylko sprawdzenia czy uzytkownik juz sie zarejestrowal czy nie, jak moge polaczyc ilosci rekordow jednego uzytkownika a nie wszystkie rekordy?

Skoro w tabeli jest cos takiego:
userID:
1
1
1
2
2
2

I chcialbym po prostu aby system dodawal ile razy zarejestrowal sie np uzytkownik o id 1?

0

Poprawilem, 2x else bylo w drugim ifie stad moj problem byl.

Teraz mam taki blad:
UncaughPDOEXPECTION: sqlstate[42000]

0

Za duzo ich bylo udalo mi sie osiagnac ten problem juz banan na twarzy :D jednak oczywiscie blad za bledem, nastepny jest jakis:
UncaughPDOEXPECTION: sqlstate[42000]

0

System mowi ze linia 15 ma blad: PDOStatement->execute

// System zliczania ilosci rejestracji jednego uzytkownika w tabeli tbl_mikrolosik6
$ilerazy = $user_home->runQuery("SELECT userID FROM tbl_mikrolosik6 WHERE COUNT userID");
$ilerazy->execute();    <- LINIA 15 <- LINIA 15 <- LINIA 15 <- LINIA 15
$tablica1 = $ilerazy->fetch(PDO::FETCH_ASSOC);
foreach ($tablica1 as $row2) {
}
// System zliczania ilosci rekordow w tabeli tbl_mikrolosik6
$ile = $user_home->runQuery("SELECT COUNT(userID) FROM tbl_mikrolosik6");
$ile->execute();
$tablica = $ile->fetch(PDO::FETCH_ASSOC);
foreach ($tablica as $row1) {
}

// Instrunkcja warunkowa, jesli jest mniej niz 6 uzytkownikow i jesli wogole nie zarejestrowal sie gosc to dodaje go do bazy
	if ($row1 < 6) {
		if ($row2 < 1)
		{
			echo 'Zarejestrowales sie, wroc do gier i czekaj na rozpoczecie turnieju';
			$dodajgracza = "INSERT INTO tbl_mikrolosik6(userID) VALUES(".$row['userID'].")";
			$dodajgracza1 = $user_home->runQuery($dodajgracza);
			$dodajgracza1->execute();
		}
		 else {
			echo 'Zarejestrowales juz sie wiec nie mozesz wiecej niz jeden raz'; 
			}
		}
		{
			echo 'Jest juz maksymalna liczba graczy, wroc jak bedzie ich mniej niz 6';
		}
0

Co według Ciebie robi zapytanie

SELECT userID FROM tbl_mikrolosik6 WHERE COUNT userID
0

Zajarzylem wlasnie ze cos tutaj musi byc nie tak, moim zdaniem to zapytanie WHERE COUNT jest zle
to zapytanie ma zliczyc ile jest rekordow jednego uzytkownika

0

To, że jest źle to jest pewne. Zastosuj metodę gumowej kaczuszki, mogę robić za kaczkę. Wytłumacz mi po prostu krok po kroku zapytanie :)

0

Chcialbym aby zapytanie zebralo ilosc rekordow danego goscia

Tak jak pisalem wyzej, tak wyglada tabela:
userID:
1
2
4
5
pojedyncze rekordy, i chcialbym aby moje zapytanie zliczylo aktualnie zalogowanego gracza ile razy sie zarejestrowal. Jesli jest juz w bazie jeden raz to wywala komunikat ze nie moze sie zarejestrowac, a jesli nie ma go to dodajemy goscia i pisze komunikat ze jest dodany ;)

0

Lektura: group by.

1 użytkowników online, w tym zalogowanych: 0, gości: 1