Poprzedni temat «» Następny temat
PHP -> potrzebne lekcje dotyczące ciastek i sesji :P
Autor Wiadomość
Serafin 

Wiek: 28
Posty: 193
Podziękowania: 11/10
Wysłany: 2006-07-21, 10:52   PHP -> potrzebne lekcje dotyczące ciastek i sesji :P

Byłoby miło, jakby ktoś mógł mi wytłumaczyć obsługę zmiennych globalnych $_SESSION i $_COOKIE w skryptach logowania/rejestracji, gdyż naczytałem się o tym na php.net, a i tak nic nie rozumiem :D. Nie pogardziłbym rowniez pomocą w zaimplementowaniu tychże zmiennych w moim skrypcie :P

Z góry dzięks
Podziękuj autorowi tego posta
 
 
Kermit 
Bibliotekarz


Wiek: 28
Posty: 144
Skąd: Chorzów
Wysłany: 2006-07-21, 12:09   

Uhm, $_SESSION zwraca wartość zmiennej zarejestrowanej podcas startowania sesji. Dzieki niej możesz zdinetyfikować czy sesja została wcze·sniej rozpoczęta, czy ktos próbuje Ci wejść w buciorach bez logowania. Możesz też nią rejestrowac nowe zmienne.

$_COOKIE natomiast służy do poznania zawartości ciastka :). Potem postaram się to rozwinąć.

Kermit.
Podziękuj autorowi tego posta
 
 
 
Hélegorn 
Beholder


Posty: 147
Podziękowania: 1/1
Skąd: z BGiF-u (RIP)
Wysłany: 2006-07-21, 15:10   

Krótko mówiąc, jak chcesz korzystać z sesji, na początku skryptu (zarówno zapisującego do, jak i odczytującego z sesji) wrzucasz linijkę:
Kod:
session_start();
Teraz możesz zapisać coś do sesji:
Kod:
$_SESSION['nazwa_zmiennej'] = wartość_zmiennej;
Z odczytaniem zmiennej sesji nie powinieneś mieć problemów, np.
Kod:
echo $_SESSION['nazwa_zmiennej']; // wypisanie wartości uprzednio utworzonej zmiennej
Trzeba zaznaczyć, że do działania sesji potrzebne jest albo zezwolenie użyszkodnika na korzystanie z ciasteczek (wówczas ID sesji jest przechowywane w ciastku; takie rozwiązanie jest najwygodniejsze dla piszącego skrypt, ale nie zawsze skuteczne), albo przekazywanie ID sesji metodą GET (w adresie strony, pewnie dlatego czasami na forum w adresie pojawia się zmienna `sid=jakiś_bełkot` ;)) lub POST.

Z ciasteczkami jest nieco "trudniej". Tzn. samo odczytywanie danych z ciastek to banał:
Kod:
echo $_COOKIES['nazwa_zmiennej']; // wypisanie wartości zmiennej zapisanej w ciachu
ale z zapisywaniem danych jest już gorzej. Ponieważ aby zapisać coś w ciachu na HDD użyszkodnika odpowiednie dane są przesyłane w nagłówku HTTP, polecenie zapisania czegoś w ciachu trzeba wykonać przed wysłaniem do przeglądarki jakichkolwiek innych danych.

Spróbujmy zatem coś zapisać do ciacha:
Kod:
<?php

/* ciacho1.php */

$wartosc = "Test";
$okres_waznosci = time()+3600*24*365; // ciacho będzie ważne przez rok od bieżącej chwili

setcookie("moje_ciacho", $wartosc, $okres_waznosci);

?>
Teraz w drugim pliku spróbujmy odczytać wartość ciacha:
Kod:
<?php

/* ciacho2.php */

echo "Wartość zapisanego ciacha to <b>" . $_COOKIE['moje_ciacho'] . "</b>.";

?>
Jeśli wszystko pójdzie dobrze, powinieneś zobaczyć:
Parser PHP napisał/a:
Wartość zapisanego ciacha to Test.
Co do pomocy w Twoim skrypcie, to jak podasz jakieś konkretne problemy, postaram(y) się pomóc.
_________________
...
Podziękuj autorowi tego posta
 
 
Kermit 
Bibliotekarz


Wiek: 28
Posty: 144
Skąd: Chorzów
Wysłany: 2006-07-22, 08:49   

O Hel mnie wyręczył :). Ja tylko dodam, że najczęściej $_SESSION jest wykorzystywane do sprawdzenia czy sesja jest nowa czy kontynuowana. Np:
Logowanie; login.php
Kod:

$nick = kermit;
$pass = wielki;

if ($nick==kermit && $pass==wielki)
{
session_start();
$_SESSION['nick'] = kermit;
header("http://kermit.pl/secret.php");
} else {
echo 'Dupa z Ciebie a nie Kermit';
}


I teraz sprawdzamy czy ktos już jest zalogowany czy mamy go odesłać do formularza logowania; secret.php
Kod:

session_start();
if (isset($_SESSION['nick']))
{
echo "Witaj" . $_SESSION['nick'];
} else {
header("http://kermit.pl/login.php");
}


Mogą być blędy w kodzie, za które przepraszam.

Kermit.
Podziękuj autorowi tego posta
 
 
 
Serafin 

Wiek: 28
Posty: 193
Podziękowania: 11/10
Wysłany: 2006-07-22, 10:32   

Jaaaaa dzięki, teraz jak to zamontować w moim skrypice logowania, który korzysta z tabel sql?:

Kod:

<?php

function login_panel ()
{

echo ( "
<form style=\"margin:0\" action=\"?go=login_panel&step=2\" method=\"post\">
    <table cellspacing=\"2\" cellpadding=\"0\" border=\"0\">
    <tr>
        <td><input style=\"background-image:url('images/login.jpg');border-width:0;width:78px;COLOR:#FFFFFF;font-family:verdana;font-size:8pt\" type=\"text\" name=\"login\"></td>
    </tr>
    <tr>
        <td><input style=\"background-image:url('images/login.jpg');border-width:0;width:78px;COLOR:#FFFFFF;font-family:verdana;font-size:8pt\" type=\"password\" name=\"pass\"></td>
    </tr>
    <tr>
        <td><input type=checkbox name=\"auto\"></td>
    </tr>
<tr>
    <td align=center>
    <input type=image src=\"images/zaloguj.jpg\" onClick=submit()>
    </td>
</tr>
</table>
</form>
    " ) ;
}

function login ( $login , $pass )
{
    $query = sql ( "SELECT id, pass FROM users WHERE login = \"". $login ."\"" ) ;
    if ( mysql_num_rows ( $query ) )
    {
        $row = mysql_fetch_array ( $query ) ;
        if ( $row [ 'pass' ] == md5 ( $pass ) )
        {
            if ( $_POST [ 'auto' ] ) // Automatyczne logowanie
            {
                setcookie ( 'login' , $row [ 'id' ] ." ". $row [ 'pass' ] , time ( ) + 999999 ) ;
                header ( 'Location: index.php') ;
            }
            else
            {
                setcookie ( 'login' , $row [ 'id' ] ." ". $row [ 'pass' ] ) ;
                header ( 'Location: index.php') ;
            }
        }
        else
        {
            echo "Wpisałeś nieprawidłowe hasło!" ;
        }
    }
    else
    {
        echo "Nie istnieje taki użytkownik" ;
    }
}

function logged ( )
{

    include ( 'menu_profile.php' );
   
}



if ( isset ( $_COOKIE [ 'login' ] ) )
{
    logged ( ) ;
}
else
{
    if ( !$_GET [ 'step' ] )
    {
        login_panel ( ) ;
    }
    elseif ( $_GET [ 'step' ] == 2 )
    {
        login ( $_POST [ 'login' ] , $_POST [ 'pass' ]  ) ;
    }
}


?>


Tu w zasadzie prawie wszystko jest, brakuje tylko porownania ciastka usera z ciastkiem, które powinno się stworzyć. Chciałbym po prostu zobaczyc jak to bedzie wyglądało w sesjach.
Podziękuj autorowi tego posta
 
 
Kermit 
Bibliotekarz


Wiek: 28
Posty: 144
Skąd: Chorzów
Wysłany: 2006-07-22, 13:26   

Nie kumam torchę? Cchfcesz sprawdzić czy istnieje ciastko usera, który chce sie automatycznie logować i jesli je ma to go zalogować, a jak nie to odesłac do formularza logowania?

Kermit.
_________________
"Bo prawdziwa wiara to Kozia wiara"
- Kermit
Podziękuj autorowi tego posta
 
 
 
Serafin 

Wiek: 28
Posty: 193
Podziękowania: 11/10
Wysłany: 2006-07-22, 13:39   

Tak, musi sprawdzic czy ciastko jest z autologowania czy jednokrotnego logowania.

I jak zrobić wylogowywanie? Wiem że trzeba usunąc ciacho, tylko jak to zaimplementować?

Aj chyba już wiem, tylko nie mam pewności czy da rade w pliku menu_profile dać opcje
Kod:

unsetcookie  ( $_COOKIE [ 'login' ] );

?

A może lepiej zrobić drugie ciacho, które - jeśli istnieje wywalałoby funkcje login_panel ( ) ?
Podziękuj autorowi tego posta
 
 
Hélegorn 
Beholder


Posty: 147
Podziękowania: 1/1
Skąd: z BGiF-u (RIP)
Wysłany: 2006-07-22, 13:51   

Ja bym fakt bycia zalogowanym zapisywał w sesji, a w ciachu wyłącznie chęć automatycznego logowania...
_________________
...
Podziękuj autorowi tego posta
 
 
Serafin 

Wiek: 28
Posty: 193
Podziękowania: 11/10
Wysłany: 2006-07-22, 14:05   

No dobra spróbuję, jakby co, będę pytał :D
Podziękuj autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  
Powered by phpBB modified by Przemo © 2003 phpBB Group