Stosuj wcięcia. Newralgiczny kawalek kodu masz nieczytelnie sformatowany.
Sprawdzanie poprawności sprawdziłeś do sprawdzenia czy zmienne w $_POST są ustawione czy nie. Zatem wpisanie nieistniejacego loginu i hasła nie pociągnie wykonania linii 67. Co gorsza, mozna jako dane wpisać typowe złosliwości typu SQL injection:
loginn: a' OR name <> '
hasloo2: a' OR pass <> '
wtedy PHP mając
"SELECT * from `char` where name = '$loginn' AND pass = '$hasloo2'"złoży zapytanie:
SELECT * from `char` where name = 'a' OR name <> '' AND pass = 'a' OR pass <> '' AND ma wyższy priorytet niz OR, wiec wyrazenie logiczne obliczy się jakby były nawiasy:
a OR b AND c OR d jest tożsame z
a OR (b AND c) OR dZdanie d w naszym zapytaniu jest zawsze prawdziwe, wiec całe wyrazenie logiczne bedzie prawdzwe dla kazdego rekordu. Sprowadza się zatem do żadania pokazania uzytkownikow z loginem
a lub niepustym haslem. Zasadniczo wszytkich, choć w zamysłe pewnie miało zwrócić tego jednego jedynego.
A co jeśli nie ma ataku SQL injection tylko nieistniejace login i hasło (czyli sytuacja o jaką pytałeś)? System zaloguje a funkcja ShowLogin w wierszu 25 nie znajdzie odpowiedniego rekordu. Poza tym mała uwaga wydajnościowa. Jesli już masz wiersz z danymi, to go nie puszczaj tak łatwo. Ten drugi SELECT jest niepotrzebny.