[PHP] - skrypt loguje użytkownika tylko z id 1


(jacko1998) #1

Witam, mam dosyć nietypowy problem, otóż skrypt logowania, loguje tylko jednego użytkownika i to tego, który ma id = 1. Oto kod:

<?phpif( isset($_POST['loguser']) ){    if( (!($_POST['username'] == '')) and (!($_POST['password'] == '' )) ){        $q = mysql_query("SELECT id FROM users WHERE `username` = '".mysql_real_escape_string($_POST['username'])."' AND `password` = '".mysql_real_escape_string($_POST['password'])."'") or die(mysql_errno().': '.mysql_error());        if( mysql_num_rows($q) == 1)        {            $user = mysql_fetch_assoc($q);            $_SESSION['logged'] = $user['id']; ?            You\'r logged in.

(kostek135) #2

Logowanie jest ok. Pokaż przykład funkcjonalności (kod) dostępnej po zalogowaniu, takiej która zachowuje się w w/w sposób.


(jacko1998) #3
$_SESSION['logged'] = $user['id']; [/code]

W tej zmiennej trzymam id użytkownika no i jak coś chcę np usunąć formularz logowania i rejestracji zalogowanemu użytkownikowi to, aby zablokować robię:

[code=php]if($_SESSION['logged'] != $user['id']:wink:{
// No i tu formularz
} else {
// Np. "Jesteś zalogowany."

No i na takiej zasadzie blokuje, tudzież usuwam części strony. Działa to jedynie w przypadku użytkownika posiadającego id = 1. W innym przypadku nic nie działa :frowning:


(kostek135) #4

Dziwne, że to działa w ogóle masz syntax error. Średnika nie powinno tam być:

if($_SESSION['logged'] != $user['id'];){

Jeśli możesz wstaw przed if'em taki kod

echo "Jestem user o id = " . $user['id'];

I powiedz co ci to wyświetla, jeśli zalogujesz się userem o id = 1, a co jeśli jakimś innym. Bo mnie bardzo zastanawia czym ty tę tablicę wypełniłeś po przekierowaniu.

PS

Jeśli ID będą się zgadzać z tymi z bazy, to opublikuj cały kod, bo trudno zgadywać, ale sądzę, że masz zły przepływ logiki. Chociażby sprawdzanie w tym ifie czy zgadza się id jest bez sensu. Wystarczy sprawdzić czy sesja istnieje, a dopiero w alternatywnym przebiegu w oparciu o id odzyskać wiersz z danymi użytkownika. Nas nie obchodzi w tym momencie kto to, tylko czy ten ktoś jest zalogowany, czy nie.


(jacko1998) #5

Tak jak mówiłem, zmienna $user['id'] = 1. Cały czas nawet bez logowania wypisuje 1, i jak się zaloguje na innych to też 1. I tak w koło Macieju ;/


(kostek135) #6

Opublikuj całość kodu (od tego if'a wzwyż najlepiej), bo sądzę, że masz tam niezły bajzel.


(jacko1998) #7

Login.php:

<?phpif( isset($_POST['loguser']) ){$_POST['username'] == '')) and (!($_POST['password'] == '' )) ){$q = mysql_query("SELECT id FROM users WHERE `username` = '".mysql_real_escape_string($_POST['username'])."' AND `password` = '".mysql_real_escape_string($_POST['password'])."'") or die(mysql_errno().': '.mysql:_error());mysql_num_rows($q) == 1)

(kostek135) #8

Wystarczy, tak jak mówiłem masz zły przepływ. Bo znowu wyciszasz ostrzeżenia zamiast je naprawić. Czy uważasz, że interpreter wyświetla je bo mu się nudzi? Twoja tablica $user nie istnieje. Po przekierowaniu wszystkie zmienne nie będące częścią sesji giną.

Przepływ powinien wyglądać następująco (pseudokod bo nie chce mi się tego sprawdzać pod względem składni):

if(sesja istnieje) {

    wyświetl informacje o braku możliwości rejestracji


    ewentualnie celem ćwiczenia zrób tak

    select z bazy w opraciu o id = $_SESSION['logged'] gdzie wynik będzie odebrany w tablicy $user

    echo "Jesteś zalogowany jako". $user['nickname'];

    i tu dopiero informacja: "nie możesz się zarejestrować".

} else {

   formularz

}

Tu masz krótkie wyjaśnienie dotyczące tworzenia, dostępu i niszczenia sesji. http://www.w3schools.com/php/php_sessions.asp


(jacko1998) #9

Dobra, nie będę już używał @ , ale powiedz mi jaki inny sposób mam sobie poradzić z błędami typu E-NOTICE ? Na jakiejś stronce, znalazłem, że trzeba zmienną zadeklarować, ale ja nie wiem jak i tego też szukam, ale nie mogę znaleźć.

-- Dodane 29.10.2013 (Wt) 22:33 --

Ok, teraz if'y działają pod warunkiem istnienia sesji i każdemu użytkownikowi funkcje są dodawane/odejmnowane podczas gdy jest on zalogowany, bez względu na jego id. Lecz nadal po wejściu na stronę zmienna $user['id']; cały czas przechowuje 1, nawet jak zaloguje się na np id 3. Nie wiem jak to naprawić, chociaż do niczego mi się to nie przyda.

-- Dodane 30.10.2013 (Śr) 7:38 --

Ale w sumie to jeżeli mówisz, że kod logowania jest OK, to dlaczego mi tego id nie pobiera ?


(kostek135) #10

Wpisz w google programowanie, definicja, deklaracja, wywołanie

Bo tablica user ginie po przekierowaniu, ile razy jeszcze razy mam to napisać? Jest to związane z bez stanowością HTTP. Gdyby wszystkie zmienne zostały zachowane, to istnienie sesji byłoby nie potrzebne, ale wtedy to internet jako taki przestałby być skalowalny. Po wykonaniu przekierowania możesz pobrać tylko to co zostało umieszczone w tablicy $_SESSION. Innymi słowy jeśli chcesz odtworzyć tablice $user to na podstawie id przechowanym w sesji, musisz wykonać select'a i pobrać użytkownika jeszcze raz. PHP jest ułomne. Drugi sposób to napchać tablicę sesji danymi, ale szybko zapchasz pamięć, w sesji powinno się znajdować jak najmniej. Dobrym rozwiązaniem, byłoby stworzenie globalnego cache'u w którym obiekty są związane przez weak references i w razie potrzeby zwolnione/odtworzone. Tylko nie wiem czy to jest do zrobienia w PHP w skalowalny sposób, bo jak mówiłem w PeHaPie to można pchać karuzele, a nie robić skalowalny system.

Wykonaj przebieg alternatywny mojego ostatniego pseudokodu, w nim musisz odtworzyć tablice user przez select.


(jacko1998) #11

Dzięki wielki kostek, za teorię. Wiesz, na początku to myślałem, co to za forum, gdzie pomaga się komuś przez podyktowanie komuś kroków do wykonania, ale ani kawałka kodu ;/ Ale tak się zaparłem i grzebałem i grzebałem, aż w końcu udało się. Także dziękuje za brak taryfy ulgowej :slight_smile: // Do zamknięcia

Pozdrawiam.