PHP – Oturumu Açık Tut (Beni Hatırla)

Başlığa beni hatırla şeklinde bir ibare ekledim fakat yapacağımız şey aslında beni hatırla dağil, oturumu açık tut sistemi olacak. Peki bu iki terim arasında fark ne?

  • Beni hatırla: Tarayıcı kapatılıp tekrar açıldığında cookie ile kullanıcı adının input değerine yazdırılması.
  • Oturumu açık tut: Tarayıcı kapatıldığında tutulan oturum sessionları silinse bile hesabın sonradan girildiğinde açık olarak karşımıza çıkması.

Beni hatırla checkbox’u neredeyse login sayfası olan tüm tasarımlarda mevcut fakat eminim ki bu özelliği ya kodlamadan geçiyorsunuz ya da HTML’den checkbox’ tamamen siliyorsunuz.

Ayrıca bu yazıda sizlere bu sistemi nasıl yapacağınızı anlatacağım ve örnek kodları paylaşacağım. Direkt olarak şu kodu yapıştırın ve özellik çalışsın gibi bir şey beklemeyin.

Adım 1: Mantığı Kavrayalım

Bildiğiniz gibi veri saklayabilmemiz için 2 yöntem var: Session ve Cookie.

Oturum işlemlerimizi yaparken session’ları terciih ediyoruz (zaten Türkçesi de oturum) çünkü cookie tarayıcı üzerinden kolayca değiştirilebilir ve güvenlik sorunlarına neden olabilir. Fakat bir de şöyle bir olay var tarayıcıyı kapattığınızda sessionlar silinir fakat cookieler istediğiniz kadar açıp kapatın çerezleri temizlemediğiniz taktirde sürekli kalacaktır. Ancak sakın çerezler silinmiyor diye oturum bilgilerinizi cookie üzerinde tutmayın 5 dakikanın altında bir sürede siteniz hacklenir ve bunu herkes yapabilir.

Sistemimizin işleyişi şu şekilde olacak; yine cookieler üzerinde çalışacağız fakat hem herhangi bir şifreyi tutmayacağız hem de şifreleme yaptıktan sonra güvenli bir şekilde yazılımımızı çalıştıracağız.

  1. Veritabanında kullanıcıların tutulduğu tabloya hash adında bir sutün oluşturuyoruz.
  2. IP adresi, kullancı adı, site adresi ve belirleyeceğimiz bir sabit ile kullancılar giriş yaparken hash adreslerini oluşturup veritabanında hash sütününü güncelliyoruz, ekstra olarak oluşturduğumuz hash değeri için bir cookie oluşturuyoruz. İsmini siteadi_hash şeklinde yapabilirsiniz.
  3. Giriş kontrol fonksiyonumuzda session kontrolünden sonra cookie üzerinde kayıtlı olan hash ile veritabanında kayıtlı olan hashlerin karşılaştırmasını yapıyoruz. Eğer uyuşan bir kayıt var ise başka birinin hash bilgisi ile giriş yapılmaması için tekrar oluşturduğumuz fonksiyon ile eşleşen kaydın kullanıcı adını kullanarak hash değerini oluşturuyoruz. Eğer bu 2 değer de birbirine eşit ise artık gönül rahatlığı ile oturum bilgilerini oluşturabilirsiniz.

Adım 2: Örnek Kodlar

Öncelikle veritabanımıza hash adında bir sutün açalım. PhpMyAdmin ile kolaylıkla yapabilirsiniz ya da bağlantıyı kurduktan sonra SQL kodunu çalıştırabilirsiniz.

Kendinize göre düzenlemeden kodu çalıştırırsanız hata alırsınız. SQL kodundaki uyeler kısmı tablo ismi, id ise hangi sütündan sonra ekleneceğidir.

Hash oluşturma fonksiyonumuz id parametresi alıyor ve gelen id ile sabitleri ve ip adresini kullanarak şifrelenmiş bir kod üretiyor. Giriş yaptıktan sonra bu fonksiyon ile kullanıcıya özel hash kodunu oluşturup, UPDATE sorgusu ile veritabanında güncellemeniz gerekiyor.

Bu veritabanı işlemlerinin kod örnekleri ve kullanımı için PDO Kullanımı yazıma göz atabilirsiniz.

Hash değerini ve kullanıcı id’sini alan cookie oluşturma fonksiyonumuz yukarıda. Bu fonksiyonu giriş yaptıktan sonra hash oluşturup hemen arkasından bunu çalıştırıyoruz ve hash değerimizi mevcut tarayıcıya kaydediyoruz.

Son kısım olan giriş kontrolündeki işlem için herkeste farklılık göstereceği için bir kod paylaşmıyorum sadece liste olarak algoritmasını yazıyorum, siz basit bir şekilde bunu kendinize gör entegre edebilirsiniz.

  1. Session kontrolünden sonra oluşturulan cookie değerinin varlığını kontrol et.
  2. Eğer cookie mevcut ise SELECT sorgusu ile aynı hash değerine sahip bir kaydın olup olmadığını kontrol et.
  3. Eğer kayıt eşleşir ise eşleşen kaydın id’si ile hash oluştur ve cookie üzerinde hash ile karşılaştır.
  4. Oluşturulan ve cookie üzerindeki hash değerleri aynı ise SESSION oluştururarak giriş işlemini otomatik olarak yaptırabilirsiniz.

Son olarak yukarıda belirtmeyi unuttum kaş yapalım derken göz çıkartmayalım. Bu işlemleri yaptığınızda tüm kullanıcıların oturumu sürekli açık kalacaktır. Bunun için giriş yapılırken eğer beni hatırlı kutusu işaretli ise cookie oluşturma işlemi yapılacak eğer kutu işaretli değil ise cookie sıfırlanacak. Sıfırlamamızın nedeni aynı kullanıcı beni hatırla seçeniğini seçerek giriş yapmış ve sonrasında tekrar giriş yaparken işareti kaldırmış olabilir ve bu durumda sessionın geçerliğini korumaması için silinmesi gerekiyor.

Anlattığım konu aslında çok basit ama hem aklınızda soru işareti kalmaması için hem de herkesin eksiksiz anlayabilmesi için birraz uzun tuttum. Umarım faydalı olmuştur.

PDO Kullanımı ve Güvenli Veritabanı İşlemleri

Madem yeni bir blog açtık, PHP PDO kullanımı yazısını yazmazsak olmaz. İlk paylaşımımız bu olsun o zaman. Umarım işinize yarar ve içeriği faydalı bulursunuz.

PHP’nin MySQL fonksiyonlarının desteğini kaldırması ile birlikte benzer yapıda olan MySQLi fonksiyonları türemiş olsa da sektörde en fazla kullanılan PDO’nun yerini almayı başaramadı. PDO’nun lider olmasının en büyük sebepleri ise; güvenlik, kullanım kolaylığı ve optimizasyon.

PDO Kurulumu & Etkinleştirme

PDO artık çok fazla yaygınlaştığı için hostinglerde ve local sunucu programlarında otomatik etkinleştirilmiş olarak geldiği için sizin herhangi bir kurulum ya da ayar yapmanıza gerek kalmıyor. Ama biz en kötü senaryoyu düşünelim, hostinginizde PDO çalışmıyor mu? O zaman adımları takip edin de aktifleştirelim şunu.

Öncelikle PDO kullanabilmemiz için php sürümümüz en az 5.1 olmalı. Değil ise cPanel üzerinden php sürümünüzü güncelleyebilir ya da bu özelliği kullanamıyorsanız hosting firmanız ile iletişime geçerek güncellenmesini sağlayabilirsiniz.

PHP sürümümüzü ayarladığımıza göre artık PDO etkinleştirme kısmına gelelim. Öncelikle php.ini dosyasını açın ve aşağıdaki 2 satırı bulun. (MySQL kullanacağınızı varsayıyorum)

  1. extension=php_pdo.dll
  2. extension=php_pdo_mysql.dll

Üstteki satırları bulduktan sonra yapmanız gereken işlem sadece  önlerindeki noktalı virgülleri (;) silmek ve dosyayı kaydetmek. Artık tamamen hazırırz, bağlantı ayarlarımızı yaparak kullanmaya başlayabiliriz.

PDO ile Veritabanı Bağlantısı

Veritabanı bağlantı kısmını bilgileri değişkene atayarak mı yazsam yoksa direkt olarak sorgu üstünde mi yapsam diye kararsız kaldım fakat son olarak değişken ile göstermeye karar verdim. Siz isterseniz değişkenleri silerek tek bir satır üzerinde bağlantı sorgusunu yazabilirsiniz. (Açıklama satırına bırakıyorum)

Başlangıç kısmındayken şunu da belirteyim veritabanı işlemlerimizi yapacağımız nesne ismini $db olarak oluşturacağım. Aynı şekilde bunu da değiştirebilirsiniz.

Bağlantı yaparken karakter setini utf-8 olarak seçtik bu yüzden myqsl fonksiyonlarındaki gibi karakter seti ile ilgili herhangi bir sorgu göndermemize gerek kalmadı.

PDO ile Tekil Select İşlemi

PDO ile veritabanından tek bir satıra ulaşmak istediğimiz zaman öncelikle query, sonrasında fetch methodlarını kullanmamız gerekiyor.

Örneğin yukarıda yazdığımız kodda ogrenciler tablosunda ismi Ahmet olan bir öğrenci olup olmadığını kontrol ettik. Çift tırnaklar arasında {$degisken} şeklinde kullanım yapabildiğimizden dolayı tırnakları bölüp değişken sonrasında tekrar nokta operatörü ile birleştirmemize gerek kalmadan kolayca değişkenimizi sorgumuzun içine yerleştirdik.

Buradaki asıl bir önemli nokta ise fetch metodu için kullandığımız FETCH_ASSOC bize geri dönen değerin bir dizi içinde döndürülmesini sağlıyor.  Sonrasında erişmek istediğimiz değeri sorgu değişkenimizin elemanlarından sütün adını kullanarak ulaşabiliyoruz.

PDO ile Çoklu Select İşlemi

Birden fazla satıra ulaşmak istediğimizde çoklu select sorgularını kullanacağız. En basit şekilde şöyle tanımlayalım; veritabanımızda bulunan öğrencilerden 20 yaşında olanları listelemek istersek karşımıza birden fazla kayıt çıkacağı için çoklu seçim işlemini yapmak zorundayız.

Aynı şekilde yine FETCH_ASSOC kavramını kullandık bu yüzden veriler dizi şeklinde geri dönüş sağladı. Burada kullandığımız farklı yapı ise rowCount methodu oldu. İngilice olarak basit bir çeviri ile count kelimesini sayaç olarak kullanabiliriz. If bloğu içinde gönderdiğimiz sorgudan etkilenen kayıtların olup olmadığını sorguladık ve eğer var ise foreach döngüsü ile sıra ile işleme soktuk. Ekrana ogrenciler tablosundan yaşı 20 olan kayıtları şu şekilde yazdırılacak.

  • 2 – Ahmet
  • 5- Mustafa
  • 8- Aleyna

PDO ile Insert (Ekleme) İşlemi

Tablomuza yeni kayıtlar ekleyeceğimiz zaman SQL sorgumuzu parça parça bölmeden PDO ile kolayca değişkenlere bağlayabilir ve içeride fonksiyonlar ile işlemler yapabiliriz. Insert işlemi yaparken prepare ve execute methodlarını kullanacağız.

Örnekte prepare methodu içindeki SQL sorgumuzda bıraktığımız her bir soru işareti (?) sonraki execute methodunda array içinde gönderdiğimiz değişkenlere eşitleniyor. Burada dikkat etmeniz gereken şey soru işaretleri ve değişkenler aynı sıra numarası eşleştirilmektedir.

PDO ile Update (Güncelleme) İşlemi

Yapı olarak ekleme işlemi ile aynı sistemi kullanacağız fakat sadece SQL sorgumuzu güncelleme şeklinde revize edeceğiz.

ID’si 10 olan öğrencini isimi = Burcu, yaşı = 20 ve sınıfı = 2 olarak güncellenecektir.

PDO ile DELETE (Silme) İşlemi

Diğer işlemlerde kullanmadığımız bir method olan exec methodunu kullanarak kayıtları sileceğiz. Bu kodu tekil ya da çoklu kayıtları silmek için kullanabilirsiniz herhangi bir ayrım yapmanıza gerek yoktur.

Buradaki örnekte her id bir adet olabileceği için tekil kayıt silme işlemi yapmış olduk. Toplu silmek isteseydik örnek olarak yas = 20 dediğimizde yaşı 20 olan kayıtlar silinmiş olacaktı. Aynı şekilde eğer WHERE ve sonrasını silecek olursak bütün öğrencileri silecektik.

Yavaş Yavaş Kapanış

Yukarıda veritabanı ile yapmak isteyebileceğiniz çoğu işlemi sizlere PDO kütüphanesinde nasıl yapılacağını göstermeye çalıştım. Siz buradaki SQL kodlarını projeniz dahilinde genişleteceksiniz, buradaki örnekler sadece olayları kavrayabilmeniz için verilen basit kodlar oldu. SQL kodlarına ORDER BY, LIMIT, GROUP, JOIN gibi eklemelerinizi yaparak daha gelişmiş işlemler yapabilirsiniz.

Az daha PDO’yu nasıl sonlandıracağımızı söylemeden kapatıyorduk dükkanı. Aslına bakarsanız PDO üzerindeki bağlantımız standart mysql fonksiyonundan farklı olarak bir değişken üzerinde tutulduğundan veritabanını sonlandırmanız çok gerekli bir şey değil fakat sonradan erişilmemesi için büyük çaplı projelerde kaynak tüketimini azaltmak için işiniz bittikten sonra şu şekilde bağlantınızı sonlandırabilirsiniz.

Yukarıda verdiğim örnekleri herhangi bir tablo üzerinde denemeden editör üzerinden yazdım ve örnek olarak buraya aktardım. Bu yüzden ufak tefek hatalarım olmuş olabilir, gözünüze çarpan bir yer olursa yorum kısmından düzeltilmesi için bildirimde bulunabilirsiniz.