Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Nie mogę się wylogować, bo pokazuje że nie jestem zalogowany
Forum PHP.pl > Forum > PHP
Tho
To mój plik index.php -> ten fragment kodu będe dodawał też do wszystkich innych by móc na każdej się wylogować - logiczne wink.gif

ale teraz mam właśnie problem z (wy)logowaniem, bo gdy się zaloguje to jest napisane: "Nie jesteś zalogowany i link do zaloguj się" odwiedzam link login.php, register.php i z obu przekierowuje na główną, na znak tego że jestem zalogowany. Co nie gra?

  1. <?php
  2. include('./top.php');
  3. include('./db_fns.php');
  4. if(@$_GET['wyloguj']=='tak')
  5. {
  6. $uo_de_2=mysql_query("DELETE FROM users_online WHERE login = '".$_SESSION['login']."'");
  7. echo "Zostałeś wylogowany<br><a href=\"logowanie.php\">Zaloguj się</a>";
  8. }
  9. else{
  10. if(@$_SESSION['zalogowany']==1)
  11. {
  12. echo "Witaj, ".$_SESSION['login']." jesteś zalogowany";
  13. echo "<br>";
  14. echo "<a href=\"?wyloguj=tak\">"."Wyloguj się!"."</a>";
  15. echo " | ";
  16. echo "<a href=\"chnpass.php\">"."Zmień hasło!"."</a>";
  17. }
  18. else
  19. echo "Nie jesteś zalogowany"."<a href=\"logowanie.php\">Zaloguj się</a>";
  20.  
  21. }
  22. ?>


Podać więcej szczegółów? Jeśli coś potrzeba, pytajcie, dodam.
Sephirus
Czy aby napewno przed tym kodem startujesz sesję? (session_start()) poza tym session_destroy() w twoim kodzie 100% wystarczy samo wink.gif i przyjrzałbym się temu zapytaniu sql bo nie jestem pewien czy podczas sprawdzania $_SESSION nie jest pusta przez poprzednie funkcję - nie pamiętam czy session_destroy jej nie czyści czasem.
by_ikar
Cytat
przyjrzałbym się temu zapytaniu sql bo nie jestem pewien czy podczas sprawdzania $_SESSION nie jest pusta przez poprzednie funkcję - nie pamiętam czy session_destroy jej nie czyści czasem.


Czyści. session_destroy wykonaj na samym końcu. Dodatkowo zmień to:

Kod
if(@$_GET['wyloguj']=='tak')


na coś takiego:

Kod
if(isset($_GET['wyloguj']))


Nie przekazujesz wartości tej zmiennej nigdzie dalej, jedynie sprawdzasz czy istnieje, więc jak znalazł nadaje się tutaj isset. Tłumienie błędów przy zastosowaniu małpy (@) jedynie spowalnia twój skrypt. Dodatkowo, instrukcja warunkowa to nie tylko if/else można też użyć tego tak:

Kod
if(warunek)
{
    //...
} elseif(warunek2)
{
    //...
} else
{
    //...
}
Tho
Ok, męcze się od samego rana, w końcu zrobiłem szybkie logowanie na głównej. I działa! smile.gif Więc tamten problem możemy już sobie darować.

Ma to tylko taką wadę że po zalogowaniu pokazuje się "jesteś zalogowany", ale nie znika formularz, kombinowałem z if'ami i else'ami, ale nie mogę jakoś tego echa z formularzem wcisnąć tak by znikało po poprawnym zalogowaniu.

  1. <?php
  2. if(@$_POST['form']==true)
  3. {
  4. if(@$login==@$logi['login'] && @$pass==@$logi['password'] && $logi['potwierdzenie']==1)
  5. {
  6. $_SESSION['zalogowany']=1;
  7. $_SESSION['login']=$login;
  8. echo "Witaj, ".$_SESSION['login']." jesteś zalogowany, <a href=\"?wyloguj=tak\">"."Wyloguj się!"."</a> | <a href=\"chnpass.php\">"."Zmień hasło!"."</a>";
  9. }
  10. elseif(@$login==@$logi['login'] && @$pass==@$logi['password'] && $logi['potwierdzenie']==0)
  11. {echo "<div id=\"blad\">Twoje konto nie zostało jeszcze aktywowane</div>";}
  12. else{echo "<div id=\"blad\">Podałeś błędny login lub hasło</div>";}
  13. }
  14. ?>


Będe wdzięczny za wskazówkę, być może źle kombinowałęm z tymi ifami... , Poprostu podaj propozycję jak powinien wyglądać ten kod i to echo które będzie znikać. Taki to gotowiec,że musiałem całość przerobić. smile.gif

Poza tym jeśli ktoś widzi jakiś błąd w tym kodzie, może można coś skrócić (lub zabezpieczyć, co ważne) proszę mi zwrócić uwagę.
by_ikar
Generalnie to straszny śmietnik robisz w kodzie, sklejasz wszystko do kupy, też tak kiedyś robiłem, jak mi się wydawało że im mniej spacji/enterów tym szybciej strona będzie mi działać, a jak się okazuje ani spacje ani entery nie mają na to najmniejszego wpływu, one są wyłącznie dla nas żeby ten kod był czytelny.

Zamiast cudzysłowia używaj apostrofów, nie będziesz musiał ich potem escapować w kodzie html:

Kod
<?php

if('POST' == $_SERVER['REQUEST_METHOD'])
{
    if($login == $logi['login'] && $pass == $logi['password'] && $logi['potwierdzenie'] == 1)
    {
        $_SESSION['zalogowany'] = 1;
        $_SESSION['login'] = $login;
        echo 'Witaj, '.$_SESSION['login'].' jesteś zalogowany, <a href="?wyloguj"> Wyloguj się! </a> | <a href="chnpass.php">Zmień hasło!</a>';
    } elseif($login == $logi['login'] && $pass == $logi['password'] && $logi['potwierdzenie'] == 0)
    {
        echo '<div id="blad">Twoje konto nie zostało jeszcze aktywowane</div>';
    } else
    {
        echo '<div id="blad">Podałeś błędny login lub hasło</div>';
    }
}


Nie rozumiem, czemu tłumisz błędy, nie tłum ich, bo to przynosi więcej szkody niż pożytku. Żeby ci formularz logowania zniknął, obejmij go całego warunkiem który sprawdza czy dana osoba jest zalogowana. Jeżeli jest, to nie wyświetli. No i dodatkowo, musisz przeładować stronę żeby ciasteczko się zapisało i żeby system mógł je odczytać, do tego potrzebne jest jedno dodatkowe przeładowanie strony.
Tho
Ok, dzięki za pomoc. Więc tak, zamieniłeś na apostrofy(sam chciałem też to zrobić ) wywaliłeś tłumienie błędów, doradziłeś sformatowanie kodu, co też miałem zrobić, dodałeś if('POST' == $_SERVER['REQUEST_METHOD']) zamiast if(@$_POST['form']==true) - w czym to ma być lepsze?

Lecz gdy teraz wysyłam formularz, niby jestem zalogowany(bo przekierowuje z logowanie.php na index), ale formularz jest jak dla zalogowanego, no i nawet nie wyświetla "witaj _login_ jesteś zalogowany", a przedtem działało...

Jeszcze tylko pokaż dokładnie jak to zrobić z tym formularzem i dlaczego nie działa a działało na moim kodzie "na brudno". Będe naprawde wdzięczny(jak już mówiłem plusy rozdam gdy zadziała to jak należy smile.gif )

Tak czy inaczej, coraz więcej rozumiem, dzięki.

UPDATE:


Mam dwa sektory php pierwszy na samym początku by nie wywalało błędu z powodu ob_start,

  1. <?php
  2. include('./top.php');
  3. include('./db_fns.php');
  4. ?>


I drugi, w miejscu gdzie chcę by wyświetlały mi się komunikaty i formularz:

  1. <?php
  2. $login = $_POST['login'];
  3. $pass = sha1($_POST['password']);
  4. $log = mysql_query("SELECT * FROM users WHERE login = '$login'") or die (mysql_error());
  5. $logi = mysql_fetch_assoc($log);
  6.  
  7. if($_POST['form']==true){
  8.  
  9. if($login==$logi['login'] && $pass==$logi['password'] && $logi['potwierdzenie']==1)
  10. {
  11. $_SESSION['zalogowany']=1;
  12. $_SESSION['login']=$login;
  13. echo 'Witaj, '.$_SESSION['login'].' jesteś zalogowany, <a href=\"?wyloguj=tak\">Wyloguj się!</a> | <a href=\"chnpass.php\">Zmień hasło!</a>';
  14. }
  15. elseif($login==$logi['login'] && $pass==$logi['password'] && $logi['potwierdzenie']==0)
  16. {
  17. echo 'Twoje konto nie zostało jeszcze aktywowane';
  18. }
  19. else{
  20. echo 'Podałeś błędny login lub hasło';
  21. }
  22. }
  23.  
  24. if($_GET['wyloguj']=='tak')
  25. {
  26. echo 'Zostałeś wylogowany<br><a href="logowanie.php">Zaloguj się</a>';
  27. }
  28. ?>


No i pod spodem formularz w html, ale jakgo wkomponować by znikał? Proszę... 6 godzina z małymi przerwami i dalej nic....
by_ikar
Cytat
dodałeś if('POST' == $_SERVER['REQUEST_METHOD']) zamiast if(@$_POST['form']==true) - w czym to ma być lepsze?


możesz równie dobrze zapisać to tak:

Kod
if(isset($_POST)


Tyle że to pierwsze rozwiązanie jest bardziej uniwersalne, i IMO czytelne. Metody przesyłania danych na serwer to nie tylko post/get jest jeszcze put/head.

Cytat
Lecz gdy teraz wysyłam formularz, niby jestem zalogowany(bo przekierowuje z logowanie.php na index), ale formularz jest jak dla zalogowanego, no i nawet nie wyświetla "witaj _login_ jesteś zalogowany", a przedtem działało...

ja tam tylko zmieniłem cudzysłów na apostrofy i skasowałem małpy tłumiące błędy. Nic więcej w sumie nie zrobiłem smile.gif

Nie widzę całości kodu, ciężko jest tak mówić co działa, co nie działa, jeżeli się tego kodu nie widzi i się można tylko domyślać..

ten fragment:

Kod
$login = $_POST['login'];
$pass = sha1($_POST['password']);
$log = mysql_query("SELECT * FROM users WHERE login = '$login'") or die (mysql_error());
$logi = mysql_fetch_assoc($log);


który masz umieszczony przed sprawdzaniem czy dane post zostały przesłane. Ogólnie to cały kod moim zdaniem jest do poprawy, zaczynając od zapytania którym się logujesz. Nie sprawdzasz loginu + hasła, sprawdzasz jedynie login (każdy kto zna login może się na dane konto zalogować wink.gif). Ogólnie dość dużo jest tutaj do poprawy..

Cytat
No i pod spodem formularz w html, ale jakgo wkomponować by znikał? Proszę... 6 godzina z małymi przerwami i dalej nic....

ten formularz musi być objęty warunkiem, przykładowo:

Cytat
if(!$zalogowany)
{
//... kod formularza logowania
} else
{
//... jesteś zalogowany!
}
Tho
Ok, całość kodu php:
(nie licząc innych plików, zapomniane_hasło itd, które to są tutaj)

1 sektor:
  1. <?php
  2. include('./top.php');
  3. include('./db_fns.php');
  4. ?>


2 sektor: (+formularz pod spodem)

  1. <?php
  2.  
  3. $login = $_POST['login'];
  4. $pass = sha1($_POST['password']);
  5. $log = mysql_query("SELECT * FROM users WHERE login = '$login'") or die (mysql_error());
  6. $logi = mysql_fetch_assoc($log);
  7.  
  8. if('POST' == $_SERVER['REQUEST_METHOD'])
  9. {
  10. if($login == $logi['login'] && $pass == $logi['password'] && $logi['potwierdzenie'] == 1)
  11. {
  12. $_SESSION['zalogowany'] = 1;
  13. $_SESSION['login'] = $login;
  14. echo 'Witaj, '.$_SESSION['login'].' jesteś zalogowany, <a href="?wyloguj"> Wyloguj się! </a> | <a href="chnpass.php">Zmień hasło!</a>';
  15. } elseif($login == $logi['login'] && $pass == $logi['password'] && $logi['potwierdzenie'] == 0)
  16. {
  17. echo 'Twoje konto nie zostało jeszcze aktywowane';
  18. } else
  19. {
  20. echo 'Podałeś błędny login lub hasło';
  21. }
  22. }
  23. ?>
  24.  
  25. <form id="logowanie" name="logowanie" method="POST" action="index.php" >
  26. Login: <input type="text" id="login" name="login" /><br />
  27. Hasło: <input type="password" id="password" name="password" /><br />
  28. <input type="hidden" name="form" id="form" value="true" />
  29. <input type="submit" value="&nbsp;&nbsp;Zaloguj!&nbsp;&nbsp;" />
  30. </form>


No i gdzie wcisnąć ten formularz? sciana.gif Nie rozumiem, dlaczego tworzy się gotowiec który nie sprawdza hasła a pobiera wszystko z rowa po loginie(bo tak robi ten skrypt, prawda? ) Od początku mi coś nie grało.

Jak polecasz to rozwiązać? Może dać sobie masz jakieś dobre gotowe rozwiązanie? Gotowiec, lub samemu umiesz to wykończyć?

Nieprawdopodobne siedzę nad tym od 7 rano z małymi przerwami... i dalej się męcze...

Na tym "skrypcie" się wzoruję to znaczy pobrałem i ciągle obrabiam... Może jest coś lepszego? Może TO? Może całkiem co innego?

Ludzie, pomocy... smile.gif

Ok, plusy rozdane - wszystkim którzy próbowali pomóc.

Nie ma chyba sensu dalej się z tym męczyć, po całym dniu syzyfowej pracy, kończe z tym rodzajem rejestracji, teraz testuje coś nowego To lepsze rozwiązanie, nieprawda?

Jeśli chcesz pomóc pisz w tym temacie, czy naprawdę to aż tak skomplikowane, żeby nikt nie wiedział? Mówię nie o tym temacie, a o tym który podałem w linku powyżej.

Ten temat można uznać za zakończony, ale naprawde bardzo proszę o pomoc w nowym.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.