Php Pdo Oturum Açma ($_SESSION)

Php pdo oturum açma konumuzda php programlama dilinde üyelerimizin nasıl oturum açtıklarını, üyelere özel sayfalara nasıl eriştiklerini basitçe anlatacağım. Bu konuda Php Üye Kayıt Sistemi konusundaki gibi bootstrap kütüphanesini kullanacağım. Bootstrap 4.3.1 sürümünü indirmek için tıklayın. Bootstrap hakkında detaylı doküman için resmi sitesini ziyaret edebilirsiniz.

Bootstrap konusu geçtiğimize göre asıl meselemize gelelim. Bir çok sitede üyeler giriş yaptıklarında kendilerine özel profil sayfaları vardır. Bu konuda basit profil sayfası örneği yapacağız. İşe veritabanımızı ve tablomuzu oluşturarak başlayalım.

Veritabanı ve Tablomuzu Oluşturalım

Aşağıdaki kodları phpmyadmin’de SQL sayfasına yazalım. Çalıştırdığımızda örnek isimli bir veritabanı ve üyeler adında bir tablomuz oluşturulacaktır. Örnek isimli bir veritabanı önceden oluşturulmuş ise kodlar çalışmayabilir.

CREATE DATABASE ornek;
USE ornek;
CREATE TABLE `uyeler` (
  `uye_id` int(11) NOT NULL AUTO_INCREMENT,
  `uye_kadi` varchar(50) NOT NULL,
  `uye_sifre` varchar(20) NOT NULL,
  `uye_eposta` varchar(50) NOT NULL,
  PRIMARY KEY (`uye_id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

Veritabanı ve tablomuzu hallettikten sonra artık oluşturduğumuz veritabanına bağlanabiliriz.

baglanti.php oluşturalım ve aşağıdaki kodları yazalım.

error_reporting(0);
session_start();
ob_start();

/* Bağlantı Değişkenleri */
$hostname = "localhost";
$username = "root";
$pass = "";
$database = "ornek";

/* Mysql Bağlantı */
try {
    $db = new PDO("mysql:host=" . $hostname . "; dbname=" . $database . "; charset=utf8", "$username", "$pass");
} catch (PDOException $error) {
    print $error->getMessage();
    exit();
}

Veritabanı bağlantımızıda halletik sırada üyenin giriş yapmasını sağlayacak formu oluşturmamız gerekiyor.

Php Pdo Oturum Açma Formu

Login.php oluşturalım ve ilk satırlara aşağıdaki kodları yazalım. Bu kodlar ile veritabanı bağlantımızı sayfamıza dahil etmiş olacağız. Ayrıca kullanıcı giriş yapmış ise ana sayfaya yönlendireceğiz.

<?php
include "baglanti.php";
if($_SESSION["login"]){
    header("Location:index.php");
}
?>

Yukarıdaki kodlar çalıştığında eğer kullanıcımız giriş yapmamış ise login.php sayfasını görmeye devam edecektir. Aşağıdaki kodlar php kodlarımızın devamına yazalım. Bu kodlar ile basit bir giriş formu oluşturduk. Kullanıcı oturum açmadığı taktirde bu sayfayı görüntüleyecektir.

<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Üye Giriş</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
</head>
<body>

<div class="container">
    <div class="col">
        <h4 class="mt-5">Üye Girişi</h4>
        <form method="post" action="">
            <div class="form-group">
                <label>Kullanıcı Adı</label>
                <input type="text" class="form-control" placeholder="Kullanıcı adı girin" name="kullanici_adi">
            </div>
            <div class="form-group">
                <label>Şifre</label>
                <input type="password" class="form-control" placeholder="Şifre girin" name="sifre">
            </div>
            <div class="form-group form-check">
                <input type="checkbox" class="form-check-input">
                <label class="form-check-label">Beni hatırla</label>
            </div>
            <button type="submit" class="btn btn-success">Giriş Yap</button>
        </form>
    </div>
</div>

</body>
</html>

Artık formumuzu oluşturduğumuza göre kullanıcıdan gelen verileri alarak veritabanında kontrolünü sağlayıp oturum açma işlemine geçebiliriz.

<?php
       if ($_POST) {
           $kullanici_adi = trim($_POST["kullanici_adi"]);
           $sifre = trim($_POST["sifre"]);
           if (!$kullanici_adi || !$sifre) {
               echo '
               <div class="alert alert-warning alert-dismissible fade show" role="alert">
                 <strong>Uyarı!</strong> Kullanıcı adı veya şifre boş bırakılamaz!
                 <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                   <span aria-hidden="true">&times;</span>
                 </button>
               </div>';
           } else {
               $uye_varmi = $db->prepare("SELECT * FROM uyeler WHERE uye_kadi = ? AND uye_sifre = ?");
               $uye_varmi->execute(array($kullanici_adi, $sifre));
               if ($uye_varmi->rowCount() > 0) {
                   $uye = $uye_varmi->fetch(PDO::FETCH_OBJ);
                   $_SESSION["login"] = true;
                   $_SESSION["uye"] = $uye->uye_kadi;
                   $_SESSION["id"] = $uye->uye_id;

                   header("Refresh: 1; url=index.php");
                   echo '
                   <div class="alert alert-success alert-dismissible fade show" role="alert">
                     <strong>OK!</strong> Başarıyla giriş yapıldı. 1 saniye sonra anasayfaya yönlendirileceksiniz.
                     <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                       <span aria-hidden="true">&times;</span>
                     </button>
                   </div>';
               } else {
                   echo '
                   <div class="alert alert-danger alert-dismissible fade show" role="alert">
                 <strong>Hata!</strong> Kullanıcı adı veya şifre boş bırakılamaz!
                 <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                   <span aria-hidden="true">&times;</span>
                 </button>
               </div>
                   ';
               }
           }
       }
       ?>

Kodların aşağıda parça parça incelenmiş halini görebilirsiniz.

Üyemizin formdan gönderdiği verileri aldık ve boş bir değer gönderip göndermediğini kontrol ettik.

$kullanici_adi = trim($_POST["kullanici_adi"]);
$sifre = trim($_POST["sifre"]);
if (!$kullanici_adi || !$sifre) {
// boş ise hata mesajı yazdırdık.
}

Üyemizin form ile gönderdiği değerler boş değil ise gönderilen verilerin veritabanındaki üyeler tablosunda herhangi bir değerle eşleşip eşlemediğini sql sorgusu ile kontrol ettik.

$uye_varmi = $db->prepare("SELECT * FROM uyeler WHERE uye_kadi = ? AND uye_sifre = ?");
$uye_varmi->execute(array($kullanici_adi, $sifre));

Veritabanı ile eşleme sağlandığında bize etkilenen satır sayısı döneceği için küçük bir koşul ile satır sayısını kontrol ettik. Eğer etkilenen satır sayısı 0’dan büyük ise veri eşleşmiş demektir. Eğer herhangi bir eşleşme yok ise else bloğundaki hata mesajı çalışacaktır. 

if ($uye_varmi->rowCount() > 0) {
$uye = $uye_varmi->fetch(PDO::FETCH_OBJ);
$_SESSION["login"] = true;
$_SESSION["uye"] = $uye->uye_kadi;
$_SESSION["id"] = $uye->uye_id;

header("Refresh: 1; url=index.php");
echo '
<div class="alert alert-success alert-dismissible fade show" role="alert">
<strong>OK!</strong> Başarıyla giriş yapıldı. 1 saniye sonra anasayfaya yönlendirileceksiniz.
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>';
}

Eşleşme sonucunda tablodaki verileri $uye değişkenine aktardık. Bu değişkendeki veriler ile $_SESSION tanımladık ve oturum açma işlemini gerçekleştirmiş olduk. Basit bir yönlendirme komutu ile sayfayı ana sayfaya yönlendirdik. Aşağıdaki kodu inceleyin.

$uye = $uye_varmi->fetch(PDO::FETCH_OBJ);
$_SESSION["login"] = true;
$_SESSION["uye"] = $uye->uye_kadi;
$_SESSION["id"] = $uye->uye_id;
header("Refresh: 1; url=index.php");

Site Yapısı Oluşturma

Yukarda basit anlamda sitemizde oturum açmış olduk. Ancak eğer kullanıcı oturum açmamış ise index.php sayfasını görmemesi gerekiyor. Bunun için index.php dosyamızın en başına aşağıdaki kodları yazıyoruz.

<?php
include "baglanti.php";

if(!$_SESSION["login"]){
header("Location:login.php");
}
?>

Biz biliyoruz ki site yapımı sırasında iskeleti parçalara ayırarak birleştiririz. Burada menümüz hep aynı kalacağı için index.php dosyamda basit bir menü oluşturdum ve menüde bazı linkler verdim. Aşağıdaki kodları inceleyelim.

<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Anasayfa</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
    <a class="navbar-brand" href="#"></a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item ">
                <a class="nav-link" href="index.php?sayfa=anasayfa">Anasayfa </a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="index.php?sayfa=profilim&id=<?php echo $_SESSION["id"]; ?>">Profilim</a>
            </li>
            <li class="nav-item">
                <a class="nav-link" href="index.php?sayfa=cikis-yap">Çıkış Yap</a>
            </li>
        </ul>
    </div>
</nav>
<div class="container mt-5">
    <div class="col">
        <!-- Buraya sayfa yapımızın php kodları gelecek. -->
    </div>
</div>
</body>
</html>

Ekran görüntüsü

Menü GörünümüYukarıdaki kodlar ile ekran görüntüsündeki menüyü hazırladık. Şimdi menüyü kullanılabilir hale getirmemiz gerekiyor. Menümüzde sayfalara ulaşmak için GET metodu ile sayfa değeri gönderdik eğer sayfa değeri oluşturacağımız Switch yapısındaki caselerden herhangi biri ile eşleşirse o dosya index.php dosyamızın içerisinde çağırılacak. Böylece menümüz sabit kalacak sadece alt kısmımız dinamik olacaktır. 

Dinamik sitelerin temeli bu şekildedir. GET ile gönderilen değer eşleşiyorsa eşlesen dosya sayfa içine dahil edilir. Böylece sayfalar arası gezinme sağlanır. Yukarıda bahsettiğimiz yapıyı Switch ile oluşturalım. 

sayfa-yapisi.php oluşturalım ve kodları yazalım.

<?php 
$sayfa = trim($_GET["sayfa"]);

switch ($sayfa){
    case "":
        include "anasayfa.php";
        break;
    case "profilim":
        include "profilim.php";
        break;
    case "cikis-yap":
        include "cikis-yap.php";
        break;
    default:
        include "anasayfa.php";
        break;
}
?>

Yapımızı oluşturduk. Şimdi index.php dosyamızda yorum bıraktığım satırda sayfa-yapisi.php dosyamızı index.php dosyamıza dahil edelim. Ben sistem klasörü içinde oluşturduğum için dosya yolunu belirtirken ona göre belirttim. Herhangi bir hata ile karşılaşmamak için sunucunuzda oluşturduğunuz dosyaların yoluna dikkat edin. 

<?php
if (file_exists("sistem/sayfa-yapisi.php")){
   include "sistem/sayfa-yapisi.php";
}else{
   echo "Sistem dosyası eksik.";
   exit();
}
?>

Yapı dosyamızı index.php dosyamıza dahil ettik. Böylece menü ile sayfalar arası gezinmeyi mümkün kılmış olduk. Şimdi basit bir ana sayfa hazırlayalım.

anasayfa.php oluşturalım ve aşağıdaki kodları yazalım. 

<div class="alert alert-primary" role="alert">
    Merhaba <?php echo $_SESSION["uye"];?>. Sisteme başarı ile giriş yaptın.
</div>

Sayfa yapısı dosyamızda GET ile sayfa değişkenine gönderilen herhangi bir değer yok ise anasayfa.php dosyasını çağırmasını belirtmiştik. Üye giriş yaptığı anda anasayfa.php dosyası ile karşılanacaktır.

Ekran görüntüsü

Anasayfa GörünümüSayfayı temeli anlatmak amaçlı olduğu için bu kadar basit yaptım 😀 Bir sonraki aşama olan profilim sayfasına geçebiliriz. Profilim sayfasında üyenin bilgilerinin düzenlenebileceği bir sayfa hazırlayacağız.

profilim.php oluşturalım ve aşağıdaki kodları yazalım. 

<?php
$id = trim($_GET["id"]);
if (is_numeric($id)) {
    $uye_getir = $db->prepare("SELECT * FROM uyeler WHERE uye_id = ?");
    $uye_getir->execute(array($id));
    if ($uye_getir->rowCount() > 0) {
        $uye = $uye_getir->fetch(PDO::FETCH_OBJ);
    } else {
        header("Location:index.php");
    }
}
?>

Yukarıda menüde GET metodu ile gönderdiğimiz id ile veritabanında üye sorgusu yaptık. Eğer üye yok ise sayfayı index.php dosyamıza yönlendirdik. Üye var ise bilgileri $uye değişkenimize aktardık. Bu değişkene aktardığımız bilgileri formumuzun value alanlarında kullanacağız. Formu oluşturmak için aşağıdaki kodları kullanalım.

<form method="post" action="">
    <div class="form-group">
        <label>Kullanıcı Adı</label>
        <input type="text" class="form-control" placeholder="Kullanıcı adı" name="kullanici_adi" value="">
    </div>
    <div class="form-group">
        <label>Şifre</label>
        <input type="password" class="form-control" placeholder="Şifre" name="sifre" value="">
    </div>
    <div class="form-group">
        <label>Eposta</label>
        <input type="email" class="form-control" placeholder="Eposta" name="eposta" value="">
    </div>
    <button type="submit" class="btn btn-primary">Güncelle</button>
</form>

Formumuzu oluşturduk. Veritabanından çektiğimiz verileri form üzerinde göstermek için value parametrelerine aşağıdaki php kodlarını yazalım. Kodları doğru form elemanlarına yazdığınızdan emin olun.

<?php echo $uye->uye_kadi;?>
<?php echo $uye->uye_sifre;?>
<?php echo $uye->uye_eposta;?>

Ekran görüntüsü

 

Profil SayfasıProfil sayfamızda bilgilerimizi gösteren formu oluşturduk ve bilgileri form elemanlarına yazdırdık. Bilgileri güncelle aşamasına geçebiliriz. Yapmamız gereken <form> başlangıç etiketinin hemen üstüne aşağıdaki kodları yazalım.

if ($_POST) {
    $kullanici_adi = trim($_POST["kullanici_adi"]);
    $sifre = trim($_POST["sifre"]);
    $eposta = trim($_POST["eposta"]);
    if (!$kullanici_adi || !$sifre || !$eposta) {
        echo '
                <div class="alert alert-warning alert-dismissible fade show" role="alert">
                  <strong>Uyarı!</strong> Boş alan bırakmamalısınız.
                  <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>';
    } else {
        $uye_varmi = $db->prepare("SELECT * FROM uyeler WHERE uye_kadi = ? AND uye_id != ?");
        $uye_varmi->execute(array($kullanici_adi, $id));
        if ($uye_varmi->rowCount() > 0) {
            echo '
                <div class="alert alert-warning alert-dismissible fade show" role="alert">
                  <strong>Uyarı!</strong> Bu üye zaten kayıtlı. Başka bir kullanıcı adı deneyin.
                  <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                  </button>
                </div>';
        } else {
            $uye_guncelle = $db->prepare("UPDATE uyeler SET uye_kadi = ?, uye_sifre = ?, uye_eposta = ? WHERE uye_id = ?");
            $uye_guncelle->execute(array($kullanici_adi, $sifre, $eposta, $id));
            if ($uye_guncelle){
                    echo '
                    <div class="alert alert-success alert-dismissible fade show" role="alert">
                      <strong>OK!</strong> Bilgiler güncellendi! Sayfa yenilenecek.
                      <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                      </button>
                    </div>';
                    header("Refresh:1; url=index.php?sayfa=profilim&id={$id}");
            }
        }
    }
}
?>

Yukarıdaki kodları parça parça inceleyelim. İlk olarak formdan post metodu ile gönderilen değerleri aldık ve boş mu kontrol ettik.

$kullanici_adi = trim($_POST["kullanici_adi"]);
$sifre = trim($_POST["sifre"]);
$eposta = trim($_POST["eposta"]);
if (!$kullanici_adi || !$sifre || !$eposta) {
/*Boş ise hata mesajı yazdırdık.*/
}

Kontroller sonucunda gönderilen değerler boş değil ise kullanıcının gönderdiği kullanıcı adının başkası tarafından kullanılıp kullanılmadığını kontrol ettik. Burada önemli nokta SQL sorgumuzu oluştururken koşullarda üye idsinin oturumu açan üyenin idsi ile aynı olmadığına dikkat etmeliyiz.

$uye_varmi = $db->prepare("SELECT * FROM uyeler WHERE uye_kadi = ? AND uye_id != ?");
$uye_varmi->execute(array($kullanici_adi, $id));
if ($uye_varmi->rowCount() > 0) {
/*Eğer kullanıcı adını başkası kullanıyorsa hata mesajı ekrana yazdırdık*/
}

Kullanıcının gönderdiği veri tablodaki başka veri ile eşleşmiyorsa yani aynı isimde başka kullanıcı adı yok ise güncelleme işlemine geçebiliriz.

$uye_guncelle = $db->prepare("UPDATE uyeler SET uye_kadi = ?, uye_sifre = ?, uye_eposta = ? WHERE uye_id = ?");
$uye_guncelle->execute(array($kullanici_adi, $sifre, $eposta, $id));
if ($uye_guncelle){
/*Üye bilgisi güncellendiğinde burası çalışacaktır.*/
header("Refresh:1; url=index.php?sayfa=profilim&id={$id}");
}

Güncelleme işlemini tamamladıktan sonra sayfadaki değişikliği görebilmek için sayfamızı yenileme kodu ile 1 saniye sonra yeniledik. Bu örnek ile üye bilgilerinin basitçe güncellenmesini inceledik. Son işlem olan oturumu kapatma işlemine geçelim.

cikis-yap.php oluşturalım ve aşağıdaki kodları yazalım. Tüm $_SESSION değişkenlerini boşalttık. Böylece kullanıcı çıkış yapmış oldu.

<?php
session_destroy();
header("Refresh:1; url=login.php");
?>
<div class="alert alert-primary" role="alert">
    Çıkış yaptınız. Görüşürüz..
</div>

Php pdo oturum açma örneğinden yola çıkarak kendi sisteminizi oluşturabilirsiniz. Temel olarak işlemler bu şekilde ilerlemekte. Örneğin basit bir yönetim paneli oluşturarak içerik ekleyebilir, düzenleyebilir, silebilirsiniz. 

Uygulama dosyalarını indirmek için tıklayın.

Bir cevap yazın

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