RSS

PHP Session (Oturum yönetimi)

59 03 Haziran 2010 ~ Musa Avcı — Başlangıç

sepetPHP de session olayını cookie ile karşılaştırarak yapalım. Çünkü kullanım ve uygulama olarak cookie ile aynı ama teknik olarak farklı. Session aynı çerezlerde olduğu gibi $_SESSION global dizisi ile okunur, fakat yazılması için çerezlerdeki gibi bir fonksiyona ihtiyaç duymaz.

Çerezlerin son kullanma tarihini biz belirlerken sessionlar tarayıcının kapatılmasıyla silinir. Yani siteye girildiğinde oluşturacağımız sessionlar, girenin sayfayı kapatmasıyla silinecektir.

Kullanım, oluşturma ve silme dışındaki asıl teknik farkı da sessionların tarayıcıya direkt olarak tanımlanmıyor olması.

Session ve cookie arasındaki fark

Bunu şöyle açıklayayım; bir çerez tanımladığımızda bu çerezin adı ve değeri tarayıcıya açıkca gönderilir ve bu değer istenilen süre boyunca tarayıcıda açık bir şekilde saklanır.

Sessionda ise kaydedilen değer ve değerin adı tarayıcıya gönderilmez. Onun yerine PHPSESSID adında içinde uzun bir session id değeri bulunan bir çerez tanımlanır. Ve bizim oluşturduğumuz sessionlar sunucuda saklanır ve girenlerin gönderdiği PHPSESSID kimliğine göre kime ait oldukları bulunur ve yeniden düzenlenir.

kredi kartıBu olayı daha iyi anlamanız için kredi kartı örneğini vereyim: Session olayı aynı kredi kartı kullanımı gibidir. Banka size bir kart verir bu kartın içinde size özel bir anahtar kod yer alır. Ama para ve bilgiler bankada saklanır.

Siz bilgilerinize ve paralarınıza ulaşmak için kartı kullanırsınız. Sessionda size direkt olarak bilgileri vermek yerine bir PHPSESSID adında değer verir ve o değer üzerinden size ait olan verileri okur ve düzenler.

Session nerelerde kullanılabilir

Oturumun kapanmasıyla silinmesi ve tekniği nedeniyle session verileri daha çok kullanıcılarınızın sitenize giriş yaptığında onları tarayıcıyı kapatana kadar giriş yapmış şekilde tutmanıza ve bazı yerlerde sanal sepet uygulamarını gerçekleştirmenizde kullanılır.

Session oluşturma

Başta da dediğim gibi sessionları tek bir $_SESSION global dizisi üzerinden okuyup, oluşturup, silebiliyoruz. Tek önemli mevzu session kullanımına ya da oluşturulmasına başlamadan önce bir kere her sayfanın en başında session_start() fonksiyonunu yazmalıyız, bu fonksiyon session olayını kullanıma hazırlar ve olmazsa olmazdır.

Bazı sunucularda session kullanımı otomatik olarak hep açıktır, açık olan sunucularda session_start() yazmaya çalışırsanız hata verir. Bu durumda bu fonksiyonu kullanmaya gerek yoktur.

session_start();
$_SESSION['mesaj'] = 'Selam dünya!';

Yukarıda ilk önce session kullanımını başlattık ve ardından aynı bir dizi tanımlarmış gibi $_SESSION global dizisine mesaj anahtarına Selam dünya! değerini verdik. Yani mesaj adında bir session oluşturduk ve değerini Selam dünya! yaptık.

Bu oluşturduğumuz değer giren kişinin tarayıcısı kapatılmadığı sürece gezdiği her sayfaya tekrar geri gönderilecek ve bir önceki sayfada yaptığı işlemleri, kullanıcı adı ya da şifre gibi verileri bu şekilde yeniden hatırlanmasını sağlayacak.

Mesela session ile bir sayfada giren kişinin adını belirtmesini isteyip tüm sayfalarda onun bu adını hatırlatabilirim.

Session dizi (array) atama

Sessionlara yazı, sayı gibi değerler atadığımız gibi aynı zamanda dizi (array) da atayabiliriz. Bunu yapmak için sıradan bir dizi tanımlıyormuş gibi davranman yeterli.

Session dizi örneği:

session_start();
$_SESSION['uyeler'] = array('Musa', 'Hakan', 'Orhan');

Bu şekilde sessionların içerisinde dizi verileride taşıyabiliriz. Ve başka sayfalarda çağırdığımızda aynen dizi şeklinde kullanmaya devam edebiliriz.

Session silme

Daha öncelerde de bahsettiğimiz gibi yine burada da session silme işleminde de unset() fonksiyonunu kullanıyoruz.

session_start();
$_SESSION['gezegen'] = 'dünya';
unset($_SESSION['gezegen']);

Yukarıda önce bir session oluşturduk ve hemen ardından da onu sildik.

Tüm sessionları silmek

Bu işlem için de session_destroy() fonksiyonunu kullanacağız. Bu fonksiyon tanımlanmış tüm sessionları yok eder.

session_start();
session_destroy();

Session var mı diye kontrol etmek

Yine diğer çalışmalarda varlığını kontrol etmekte kullandığımız isset() fonksiyonunu kullanacağız. Bu fonksiyon eğer içine yazdığımız session varsa olumlu yoksa olumsuz döner.

session_start();
echo isset($_SESSION['deneme']);

Session kullanımı hakkında bir örnek

Hemen anlattıklarımızı pekiştirip pratik yapmak üzere basit bir örnek gösterelim;

Öncelikle ilk.php adında bir php dosyası oluşturalım ve içinde bir session oluşturup bir başka php sayfasında o veriyi okutmayı deneyelim.

ilk.php:

<?php
session_start();
$_SESSION['isim'] = 'Musa';

echo 'Sessionumuzu oluşturduk.';
?>

Bu sayfayı oluşturup çalıştırdıktan sonra 2. php sayfamızıda yapalım. Bunun adıda son.php olsun.

son.php:

<?php
session_start();

echo 'Daha önceden kaydedilmiş isim: ' . $_SESSION['isim'];
?>

ilk.php yi ziyaret ettikten sonra bu sayfaya geldiğimizde ekranda Daha önceden kaydedilmiş isim: Musa yazacaktır. Eğer ilk.php ye uğramadan yani sessionumuzu oluşturmadan son.php ye girmeye çalışırsak böyle bir session oluşturulmadığı için kod hata verecektir.

Bir sonraki PHP serüveninde görüşmek üzere esen kalın.

Etiketler:

Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.

"PHP Session (Oturum yönetimi)" yazısı için 59 yorum yapılmış.

  1. […] PHP ile çerezler(cookie) ve session (oturum yönetimi). […]

  2. […] dizileri PHP from kullanımı ve örnekleri, PHP Cookie ve PHP Session başlıkları altında detaylı bir şekilde ele […]

  3. kaan web deneme dedi ki:

    bilgiler için teşekkürler emeğiniz çok büyük allah razı olsun.

  4. Emre dedi ki:

    harika bilgiler vermişsin teşekkürler.

  5. emrecan dedi ki:

    ilk defa bir bloga yorum yapıyorum gerçekten basit ama faydalı bilgiler vermişsiniz teşekkür ederim

  6. emrecan dedi ki:

    ustunde calıstıgım basit bbi projede login işlemini cookie ile kontrol ediyordum fakat baktımki cookie ler dısardan değiştirilebiliyor session işlemlerindede 1-2 deneme sonucunda basarızlıga ugrayınca vaz geçmiştim bu anlatımız ile denedim ve çalıştırdım yine saolun

  7. Hasan dedi ki:

    Hocam ben örneğinizi çok begendim teşekkür ederim…

  8. mustafa dedi ki:

    emeğiniz için teşekkürler. basit ve faydalı bir yazı olmuş. ama belki benim gözümden kaçmıştır bilemiyorum ama session komutlarının html kodlarından önce yazılması gerektiğini göremedim. eğer konuda geçiyorsa kusuruma bakmayın. sadece önemli olduğunu düşündüğüm için yazmak istedim.

  9. yunus dedi ki:

    merhaba bir şey sormak istiyorum. örneğin test.php sayfasında mysql e bir veri girdik. burda girdiğim veri db de otomatik id alacaktır ve bu id yi demo.php ye sessionla nasıl taşıyabilirim. Yani kaydettiğim verinin id yi nasıl sessiona atayabilirim bu daha önemli =)

  10. yunus dedi ki:

    çözdüm mysql_insert_id bu işe yariyormuş fakat ayni anda iki giriş yapılırsa yani başka kullnici tarafından acaba nasıl bir sonuç bırakir

  11. erhan dedi ki:

    oncelikle emeginize saglik. Verdiginiz ornekte son.php dosyasina direkt gidildiginde dogal olara musa isminin basilmayacagini soylediniz. Benim sorum direkt son.php dosyasina gidilmesini nasil engelleriz. Yani son.php’ye gitmek icin ilk.php dosyasindan gidilmeli

    • Metehan dedi ki:

      if ile sorgulatırsın önce bu session bu tarayıcıda kayıtlımı kayıtlıysa devam eder kayıtlı değilse ilk.phpye yönlendirme yaparsın

  12. aydin dedi ki:

    admin paneli yaparken sadece cookie ile giriş kontrollerini yapmak mümkün mü acaba? yoksa illa cookie ve sessionları birlikte mi kullanmalıyız?
    sorum sadece yeterli olma açısından.

  13. Çayan dedi ki:

    Net, açık bir yazı olmuş. Çok işime yaradı, teşekkürler.

  14. Şu derslerin altına bi de uygulama dosyasını rar layıp koysanız daha iyi olacak ben htaccess konusunu hiç anlamadım mesela

  15. googl seo dedi ki:

    müthiş bilgiler bunlar teşekkürler

  16. Musa dedi ki:

    Ne guzel bi siteymis bu yahu 🙂
    Tesekkurler.

  17. Mert Köseoğlu dedi ki:

    Merhaba benım login.php dosyamda

    $kadi = $_POST[‘kadi’];
    $sifre = $_POST[‘k_sifre’];

    $giris_k = mysql_query(” SELECT * FROM uyeler WHERE kadi='”.$kadi.”‘ OR mail='”.$kadi.”‘ AND sifre='”.sha1(md5($sifre)).”‘ “) or die(mysql_error());

    if(mysql_num_rows($giris_k)) {
    $_SESSION[“login”] = “true”;
    $_SESSION[“kadi”] = $kadi;
    $_SESSION[“sifre”] = $sifre;
    header(“Location:admin.php”);
    }
    else {
    echo “Böyle Bir Kullanıcı Adı veya E-Posta Yok !”;
    }

    OR mail=”$kadi”
    olarak da tanımladım.

    Admin sayfamda ise

    echo “Hoşgeldin “.$_SESSION[“kadi”].”“;

    Seklinde. Ben e postam ile girdiğimde hosgeldin [email protected] diye cıkıyor. İsmimle hitap edemez mi ? 🙂

    • Musa Avcı dedi ki:

      giriş yaptıktan sonra tekrar bir SQL sorgusu yapıp başarıyla giriş yapmış kişinin bilgilerini veritabanından çekip kullanmayı deneyin.

      • ersel dedi ki:

        veritabanından giriş yapmış kişinin bilgilerini nasıl çekeceğiz? her yere baktım bulamadım bir türlü, phpde yeniyim

        • Osman dedi ki:

          giriş yaptırdıktan sonra kullanıcı bilgilerini kullanmak istediğiniz sayfada bu şekilde sorgu yapabilirsiniz:
          $kullanici=mysql_query(“select * from uyeler where kadi=’ “. $_SESSION[‘kadi’] .”‘”);
          $bilgiler=mysql_fetch_assoc($kullanici);
          echo “Hoşgeldin $bilgiler[kadi]”;

  18. Bodrum Emlak dedi ki:

    yararlı bilgi için teşekkürler.

  19. Hayal dedi ki:

    public function giris()
    {
    $this->load->view(‘yonetim/giris’);
    }

    public function login()
    {
    session_start();
    $this->load->library(“session”);
    $ad = $this->input->post(“ad”,TRUE);
    $sifre = $this->input->post(“sifre”,TRUE);

    $query = $this->db->query(‘SELECT * FROM yonetici’);
    $g_veri = $query->$row();

    if ($ad = $g_veri->kul_adi && $sifre = $g_veri->sifre )
    {
    $this->session->set_userdata(“adminonline”,1);
    redirect(site_url().”yonetim/panel”);

    }else{
    echo “Yanlış”;
    }

    }

    public function panel()
    {
    session_start();
    $this->load->library(“session”);
    $online = $this->session->userdata(“adminonline”);

    if($online = 1)
    {
    echo “yonetim paneli”;
    }else{
    redirect(site_url().”yonetim”);
    }
    }

    Böyle bir giriş paneli yaptım. Fakat giriş butonuna tıkladığımda aşağıda ki hata ile karşılaşıyorum.Nedeni nedir acaba?

    An Error Was Encountered

    In order to use the Session class you are required to set an encryption key in your config file.

  20. burhan dedi ki:

    merhaba musa bey merhaba musa bey, size bir sorum olacak

    ben bir login sayfasi yaptim , kisi kullanici adini giriyor ve dogru ise sayfaniza hos geldihiniz yaziyor ve baska bir sayfaya yonlendiriyor . benim yapmak istedigim bu yeni sayfa girilen bilgi yani kullanici adi ile ilgili tum bilgilerin mysql den alinmasi ve ekranda göruntulenmesi , sorunum login yapiyorrum mesala L1 kullanici bilgiler karilastiriliyor ve dogru ise yeni sayfaya gecis yapiyor , ama bu yeni sayfada sadece L1 bilgilerinin görunmesini istiyorum, ama birtzuelu basaramadim . login sayfasinda girilen ismini bu yeni saYFADa nasil gösterebilirim bana yardimci olursaniz cok sevinirim,

    • Rehacan dedi ki:

      Merhaba,

      işin zor kısmını halletmişsin aslında zannımca. üyeleri tuttuğun veri tablosunda üye id si bölümü oluşturmuş olmalısın. yapman gereken, kullanıcı adı şifre ile kontrol ettiğin kullanıcının id sini tespit etmek. Devam eden sayfada da o id li kullanıcıyı referans alarak bilgileri veritabanından çekmek. örneklemek için kodlarını gönderirsen yardımcı olmaya çalışırım.

  21. mehmet dedi ki:

    ben php html ile nasıl kullancağımı bilmiyorum bana yardımcı olyrmusunuz

    • Muhammet dedi ki:

      Php uzantılı dosya içerisinde tagları dışında olmak kaydıyla normal kullandığınız gibi html kodlarını kullanabilirsiniz. Eğer php tagları içersinde kullanacaksanız bir değişkene atayarak kullanabilirsiniz. 🙂

  22. yakup dedi ki:

    Çok teşekkür ederim sağolun

  23. ozan dedi ki:

    Burada anlamadığım şey örneğin bir kişi siteyi ziyaret edince ona
    session verdik ama siteye binlerce kişi gelebilir hepsini örneğin tek bir
    $_SESSION[”] icinde nasıl tutucaz.

    • Muhammed dedi ki:

      Session oturumu her kullanıcı için fakrlı bir session id oluşturularak başlatılır. Yani kullanıcıların session değerleri kendilerine özgüdür. Örnek ile açıklamak gerekirse; $_SESSION['kullanıcıID'] = $id; koduyla bir session başlattığını var sayar isek ve $id değişkenini veritabanından getirdiğini düşünürsek (giriş işlemleri sonrası) kullaniciID oturumu giriş yapan her üye için başlatılır ama değeri dinamiktir, yani giriş yapanın kendi id değeri tutulur.

  24. Bcoder dedi ki:

    Arkadaşlar giriş sisteminde sadece kadi ile şifreyi çekiyoruz peki diğer bilgileri çekip nasıl session yapıcağız ?

  25. Anıl dedi ki:

    Hocam emeğine sağlık session konusunu ilk defa senden öğreniyorum daha ilk denememde başarılı oldum tekrardan teşekkürler 😀

  26. PC-K0p4T dedi ki:

    Ya veri tabanınadan çekersek o nasıl onuda anlatsaydın bilen var vbilmeyen var.

  27. serdar dedi ki:

    güzel nlatım için teşekkürler

  28. el_Zara dedi ki:


    Çok teşekkür ederim, Elinize Sağlık.

  29. Anar dedi ki:

    databaseden info cekmek icin boyle bil select cumlesi yaziriq
    $sql=”select * from TBL_NAME where id=$_SESSION[‘id’]”

  30. yigit dedi ki:

    size bir sorum olucakti ben sitemde mybb forum kullaniyorum ve orda bir kisi username ile giris yapmis oldugunda ikinci kez ayni username ve sifre ile giris yapmasina izin vermesin veya ilk gioren kisiyi logout yapsin bunu nasil yapabilirim yardimci olabilirmisiniz.

  31. şerif dedi ki:

    Teşekkürler, çok faydalı bilgiler paylaşıyorsunuz.

  32. dılo sürücü dedi ki:

    mysql where şartı kullanıp yapabilirsin
    $al=mysql_query(“select username from users where mail=’$kadi”);
    $aldir=mysql_fetch_array($al);
    echo $aldir //kulanıcı ismini ekrana yazar mantık bu

    • dılo sürücü dedi ki:

      username senin veritabanındaki kulanıcı ismi colon ismi users ise tablo ismi..yani users tablosundan username adlı kolonun verisini alıyor şart nedir where komutu ile yapıyoruz where email=’$kadi’ seklınde bu sayede şarta uaynın verisini çeker an amantık bu…

  33. ibrahim Halil dedi ki:

    hocam session_start’ı tüm sayfalarda kullanmamız gerektiğini söylemişsiniz sitenin ana sayfası felandamı içinde.. (Tüm sayfalarda kullanınca hata veriyor)

  34. CEM dedi ki:

    Merhaba,
    Ben sorunsuz Session kullanımını yapabiliyorum. Ancak include özelliğiyle kullandığım sayfada session içeriyorsa sorunsuz çalışıyor ancak uyarı veriyor. Bu sorunu nasıl aşarım. Sessiona aldığım bilgiler include ettiğim sayfada da gerekli. “Notice: A session had already been started” şeklinde uyarı veriyor.

  35. Aydın dedi ki:

    Abi müthişsin ya php ile ilgili ne arasam bu site. Anlatımın çok güzel makalelerin çok doyurucu.

  36. hasan dedi ki:

    s.a hocam kullanıcı adı ve şifresi ile oturum açan kullanıcının son giriş tarihini nasıl yazdırabiliriz örnek bir kodlama yapabilirseniz sevinirim saygılar

  37. Uğur KORKMAZ dedi ki:

    WordPress kodları tenklendirmek için hangi eklentiyi kullanıyorsunuz.

  38. Nicat dedi ki:

    Selamlar.Usta ellerine saglik iyi anlatim yapmissin, 2010 yilda olsa bile yinede iyi bir anlatim hala 2016 icin …

  39. Yuşa dedi ki:

    çerez harası alıyorum yardımcı olacak var mı
    “Warning: session_start() [function.session-start]: Cannot send session cookie – headers already sent by (output started at C:\AppServ\www\yu58\yusaa.php:24) in C:\AppServ\www\yu58\yusaa.php on line 58” bu hata nedir yarın sınavım var çalışamıyorum acil yarrdım edecek biri var mı

    • Musa Avcı dedi ki:

      hata mesajında diyor ki; yusaa.php dosyasının 24. satırında çıktı başlatılmış. 58. satırda ise session_start() fonksiyonu çağırılmış. session_start() fonksiyonu ekrana hiç bir çıktı basılmadan önce çağırılması gerekiyor. Eğer kodunun ilk satırlarına ya da 24. satırdan önceye taşırsan hata düzelecektir.

      • Yuşa dedi ki:

        öncelikle cevabın için teşekkürler lakin session_start() fonkisyonunu ilk satıra alsam gene aynı hatayı veriyor bu sefer hata en üstte çıkıyor 🙁

      • Yuşa dedi ki:

        Warning: session_start() [function.session-start]: Cannot send session cache limiter – headers already sent (output started at C:\AppServ\www\yu58\yusaa.php:1) in C:\AppServ\www\yu58\yusaa.php on line 2 bu hatayıda alıyorum 🙁

  40. Muhammet Aygün dedi ki:

    Hocam güzel anlatım. Ama benim merak ettiğim bir husus var. Ben hesabım.example.com ‘da oturum açıp diğer diğer sub domainlerde de bu oturumu açık tutmak istiyorum. sub1.example.com gibi…

  41. MUSTAFA BARAK dedi ki:

    Allah sizlerden razı olsun, Türkiyede yazılımcı yetişmesine büyük katkıda bulunuyorsunuz.

  42. troy dedi ki:

    bu kodda session start oluşturmaya gerek yok . sadece sessıon’u cagırdıgmızda gerek var özetle.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir