PHP, MySQL ile cookie (çerez), session (oturum) kullanarak login (giriş) sayfası yapımı ve kullanıcı yönetimi (user management)

makale.baslik

Bu uygulamamız PHP, MySQL ile beni hatırla özellikli login sayfası yapımını ve kullanıcı yönetimini göreceksiniz.

Örnek uygulama ile web sitelerinizde admin panelinde veya sitenizin direk kullanımında oturum ve çerez kullanımını öğreneceksiniz. Bununla birlikte kullanıcı yönetiminin de nasıl olduğunu kavrayacaksınız. Kullanıcı ekleme, listeleme,  silme ve düzenleme işlemlerini kapsayan yararlı bir uygulama olduğunu düşünüyorum.

Öncelikle login sayfası kullanacağınız yapılarda güvenliğe dikkat edeceksiniz. Güvenlik çok önemli ise beni hatırla kısmı olmadan sisteminizi oluşturunuz. Ama güvenlik çok önemli değil ise şifre girilme kısmı kullanıcıları yoracaksa beni hatırla kısmı kullanabilirsiniz.

Veri tabanı için blog adında ve içinde kullanicilar tablosu olan bir veri tabanını aşağıdaki gibi oluşturacağız.

 

veri tabanı login

Sonrasıda veri tabanına bağlanmak için inc/vt.php sayfasını oluşturuyoruz.

<!-- inc/vt.php-->
<?php
//mysql veri tabanına bağlanıyoruz
//sizde kendi veri tabanına göre bilgilerinizi güncelleyin
//3. parametre password bende boş sizde kendi kullanıcı bilgilerinize göre düzenleyin
@$baglanti= new mysqli("localhost","root","","login");
   if($baglanti->connect_error)
   {
       //hata varsa yazdırıyoruz ve sayfayı sonlandırıyor
      echo $baglanti->connect_error." hatası oluştu";
      exit;
   }

//türkçe karakter sorunu olmasın diye karakter setini ayarlıyoruz
$baglanti->set_charset("utf8");
?>

 

Login sayfasının tasarımını bootstrap ile yaptım. Burada önemli olan beni hatırla kısmında nasıl bir yapı kullanacağınızdır. Başka kaynaklarda farklı yapılar görebilirsiniz. Beni hatırla kısmında çerez (cookie) kullanmak gerekiyor. Burada bir sıkıntı ortaya çıkıyor. Çerezde ne bilgisi tutacaksınız. Çünkü çerezler kullanıcının bilgisayarında tutulmaktadır ve güvenlik riski oluşturabilir. Burada kullanıcın giriş yaptıktan sonra sistemdeki verilerinin güvenliği söz konusu oluyor. Çoğunlukla kişisel bilgisayardan giriş yapılıyorsa çerez kullanımında sıkıntı yok. Bu konuyu iyi düşünüp karar vermeniz gerekiyor.

Ben bu uygulamada kullanıcı adını alıp başına ve sonuna eklemeler yaparak md5 ile şifreleyerek çereze yazdım.

setcookie("cerez",md5("aa".$txtKadi."bb"),time()+ (60*60*24*7));

Çerezi okurken de veri tabanından kullanıcı adlarını alıp aynı işleme tabi tutup karşılaştırmasını yaptım. Login.php sayfası bu bilgiler ışığında aşağıdaki gibi olacak.


<!--Login.php-->
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <link href="css/bootstrap.min.css" rel="stylesheet"/>
    <title>Giriş</title>
    <style>
        .kutu {
            margin-top: 40px
        }
    </style>
</head>
<body>
<?php
session_start(); //oturum başlattık
include("inc/vt.php"); //veri tabanına bağlandık 

//eğer mevcut oturum varsa sayfayı yönlendiriyoruz.
if (isset($_SESSION["Oturum"]) && $_SESSION["Oturum"] == "6789") {
    header("location:index.php");
} //eğer önceden beni hatırla işaretlenmiş ise oturum oluşturup sayfayı yönlendiriyoruz.
else if (isset($_COOKIE["cerez"])) {
    //Kullanıcı adlarını çeken sorgumuz
    $sorgu = $baglanti->query("select kadi from kullanicilar");

    //Kullanıcı adlarını döngü yardımı ile tek tek elde ediyoruz
    while ($sonuc = $sorgu->fetch_assoc()) {
        //eğer bizim belirlediğimiz yapıya uygun kullanıcı var mı diye bakıyoruz.
        if ($_COOKIE["cerez"] == md5("aa" . $sonuc['kadi'] . "bb")) {

            //oturum oluşturma buradaki değerleri güvenlik açısından
            //farklı değerler yapabilirsiniz
            //aynı zamanda kullanıcı adınıda burada tuttum
            $_SESSION["Oturum"] = "6789";
            $_SESSION["kadi"] = $sonuc['kadi'];

            //sonrasında index sayfasına yönlendiriyorum
            header("location:index.php");
        }
    }
}
//Giriş formu doldurulmuşsa kontrol ediyoruz
if ($_POST) {
    $txtKadi = $_POST["txtKadi"]; //Kullanıcı adını değişkene atadık
    $txtParola = $_POST["txtParola"]; //Parolayı değişkene atadık
}
?>
<!-- Formumuzu oluşturuyoruz-->
<form id="form1" method="post">
    <div class="row align-content-center justify-content-center ">
        <div class="col-md-3 kutu">
            <h3 class="text-center">Giriş Ekranı</h3>
            <table class="table">
                <tr>
                    <td>
                        <!-- Kullanıcı adı form gönderildiğinde kaybolmasın diye value ya ekliyoruz-->
                        <input type="text" ID="txtKadi" name="txtKadi" class="form-control" placeholder="Kullanıcı adı"
                               value='<?php echo @$txtKadi ?>'/>

                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="password" ID="txtParola" name="txtParola" class="form-control" placeholder="Parola"/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <label>
                            <input type="checkbox" ID="ckbHatirla" name="ckbHatirla"/>
                            Beni hatırla
                        </label>
                        <br>
                        <?php
                        //Post varsa yani submit yapılmışsa veri tabanından kontrolü yapıyoruz.
                        if ($_POST) {
                            //sorguda kullanıcı adını alıp ona karşılık parola var mı diye bakıyoruz.
                            $sorgu = $baglanti->query("select parola from kullanicilar where kadi='$txtKadi'");
                            $sonuc = $sorgu->fetch_assoc();

                            //parolaları md5 ile şifreledim ve başına sonuna kendimce eklemeler yaptım.
                            if (md5("56" . $txtParola . "23") == $sonuc["parola"]) {
                                $_SESSION["Oturum"] = "6789"; //oturum oluşturma
                                $_SESSION["kadi"] = $txtKadi;

                                //eğer beni hatırla seçilmiş ise cookie oluşturuyoruz.
                                //cookie de şifreleyerek kullanıcı adından oluşturdum
                                if (isset($_POST["ckbHatirla"])) {
                                    setcookie("cerez", md5("aa" . $txtKadi . "bb"), time() + (60 * 60 * 24 * 7));
                                }
                                header("location:index.php"); //sayfa yönlendirme
                            } else {
                                //eğer kullanıcı adı ve parola doğru girilmemiş ise
                                //hata mesajı verdiriyoruz
                                echo "Kullanıcı adı veya parola yanlış!";
                            }
                        }
                        ?>
                    </td>
                </tr>
                <tr>
                    <td class="text-center">
                        <input type="submit" class="btn btn-primary btn-block" ID="btnGiris" value="Giriş"/>
                    </td>
                </tr>
            </table>
        </div>
    </div>
</form>
</body>
</html>

Mevcut örnekte oturum açılmış ise index.php sayfasına gidiyor. Burada mevcut kullanıcıları listeledim. Mevcut kullanıcıların düzenleme ve silme işlemleri içinde linkler yerleştirdim.  Yeni kullanıcı oluşturma butonu ve çıkış butonu da koydum. index.php de şu kodlardan oluşuyor:

<!--index.php-->
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>İndex</title>
    <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">
</head>
<body>
<?php
session_start(); //oturum başlattık
//oturumdaki bilgilerin doğruluğunu kontrol ediyoruz
if (isset($_SESSION["Oturum"]) && $_SESSION["Oturum"] == "6789") {
    //eğer veriler doğru ise sayfaya girmesine izin veriyoruz
    $kadi = $_SESSION["kadi"];
} else {
    header("location:login.php");
}
?>
<div class="container">
    <!-- Kullanıcı adını ekrana yazıyoruz-->
    <h1>Merhaba <?php echo $kadi; ?></h1>

    <!-- Yeni kullanıcı ve çıkış linkleri-->
    <a href="register.php" class="btn btn-primary">Yeni Kullanıcı</a>
    <a href="logout.php" class="btn btn-danger">Çıkış</a> <br><br>

    <div class="col-md-6">
        <table class="table">
            <tr>
                <th>Kullanıcı Adı</th>
                <th>İşlem</th>
            </tr>
            <?php
            include("inc/vt.php");
            //kullanıcılarımızı veri tabanından çekiyoruz
            $sorgu = $baglanti->query("select * from kullanicilar");

            //kullanıcıları tek tek while ile alıyoruz
            while ($sonuc = $sorgu->fetch_assoc()) {
                ?>
                <tr>
                    <td><?php echo $sonuc["kadi"] ?></td>
                    <td>
                        <!-- Düzenleme ve silme linklerini id değerlerini yollayarak oluşturuyoruz-->
                        <a href="userEdit.php?id=<?php echo $sonuc["id"] ?>"><img src="image/duzenle.png"/></a>
                        <a href="userDelete.php?id=<?php echo $sonuc["id"] ?>"><img src="image/sil.png"/></a>
                    </td>
                </tr>
                <?php
            }
            ?>
        </table>
    </div>
</div>
</body>
</html>

 

index.php

 

 

register.php ile yeni kullanıcı oluşturuyoruz.  Login.php sayfasındaki şablonu kullanarak bu sayfayı oluşturduk. Kullanıcın girdiği verileri kontrol edip veri tabanına kaydediyoruz. Bu sayfayı aşağıdaki şekilde oluşturuyoruz. Kodların açıklamaları açıklama satırında.

<!--register.php-->
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <link href="css/bootstrap.min.css" rel="stylesheet"/>
    <title>Giriş</title>
    <style>
        .kutu {
            margin-top: 40px
        }
    </style>
</head>
<body>

<?php
session_start(); //oturum başlattık
include("inc/vt.php"); //veri tabanına bağlandık 

//eğer mevcut oturum yoksa sayfayı yönlendiriyoruz.
if (!isset($_SESSION["Oturum"]) || $_SESSION["Oturum"] != "6789") {
    header("location:login.php");
}

//Giriş formu doldurulmuşsa kontrol ediyoruz
if ($_POST) {
    $txtKadi = $_POST["txtKadi"]; //Kullanıcı adını değişkene atadık
    $txtParola = $_POST["txtParola"]; //Parolayı değişkene atadık
    $txtParolaTekrar = $_POST["txtParolaTekrar"]; //Parolayı değişkene atadık
}
?>
<!-- Formumuzu oluşturuyoruz-->
<form id="form1" method="post">
    <div class="row align-content-center justify-content-center ">
        <div class="col-md-3 kutu">
            <h3 class="text-center">Yeni Kullanıcı Ekle</h3>
            <table class="table">
                <tr>
                    <td>
                        <!-- Kullanıcı adı form gönderildiğinde kaybolmasın diye value ya ekliyoruz-->
                        <input type="text" ID="txtKadi" name="txtKadi" class="form-control" placeholder="Kullanıcı adı" value='<?php echo @$txtKadi ?>'/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="password" ID="txtParola" name="txtParola" class="form-control" placeholder="Parola"/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="password" ID="txtParolaTekrar" name="txtParolaTekrar" class="form-control" placeholder="Parola Tekrar"/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <?php
                        //Post varsa yani submit yapılmışsa veri tabanından kontrolü yapıyoruz.
                        if ($_POST) {

                            //Verilerin düzgün girilip girilmediğini kontrol ediyoruz
                            if ($txtParola == $txtParolaTekrar && $txtParola != '' && $txtKadi != '') {
                                //parolayı belilirlediğimiz şekilde şifreliyip veri tabanına yazıyoruz
                                $txtParola = md5('56' . $txtParola . '23');
                                if ($sorgu = $baglanti->query("INSERT INTO kullanicilar (kadi, parola) VALUES ('$txtKadi', '$txtParola')")) 
                                {
                                    header("location:index.php"); //kayıt başarılı ise sayfayı yönlendiriyoruz
                                } 
                                else 
                                {
                                    echo 'bir hata oldu tekrar deneyin';
                                }
                            } 
                            else 
                            {
                                //eğer kullanıcı adı ve parola boş ve paralolar uyuşmuyorsa 
                                //hata mesajı verdiriyoruz
                                echo "Alanları düzgün doldurunuz";
                            }
                        }
                        ?>
                    </td>
                </tr>
                <tr>
                    <td class="text-center">
                        <input type="submit" class="btn btn-primary btn-block" ID="btnGiris" value="Kaydet"/>
                    </td>
                </tr>
            </table>
        </div>
    </div>
</form>
</body>
</html>

 

register.php

 

Çıkış için ayrı bir sayfa oluşturdum. loguot.php ile tüm çerez ve oturum bilgilerini siliyoruz. Çıkış için bir tasarıma da gerek yok doğrudan login.php sayfasına yönlendirme yapıyor.

<!--Logout.php-->
<?php
//oturumu sonlandırıyoruz
session_start();
session_destroy();

//çerezi siliyoruz
setcookie("cerez", "", time()-3600);

//sayfayı yönlendiriyoruz
header("location:login.php");
?>

 

userEdit.php sayfası ile mevcut kullanıcı bilgilerini güncellemek için kullanıyoruz. Mantık yeni kullanıcı ekle ile aynı te fark mevcut kullanıcı bilgilerini forma yansıtıp değişiklik yapıldıktan sonra veri tabanın da güncelleme sorgusu çalıştırıyoruz.

<!--userEdit.php-->
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <link href="css/bootstrap.min.css" rel="stylesheet"/>
    <title>Giriş</title>
    <style>
        .kutu {
            margin-top: 40px
        }
    </style>
</head>
<body>
<?php
session_start(); //oturum başlattık
include("inc/vt.php"); //veri tabanına bağlandık 

//eğer mevcut oturum yoksa sayfayı yönlendiriyoruz.
if (!isset($_SESSION["Oturum"]) || $_SESSION["Oturum"] != "6789") {
    header("location:login.php");
}

//güncelleme yapılacak kullanıcının verilerini alıyoruz
$id = (int)$_GET["id"];
$sorgu = $baglanti->query("select * from kullanicilar where id=$id");
$sonuc = $sorgu->fetch_assoc();
?>
<!-- Formumuzu oluşturuyoruz-->
<form id="form1" method="post">
    <div class="row align-content-center justify-content-center ">
        <div class="col-md-3 kutu">
            <h3 class="text-center">Kullanıcı düzenle</h3>
            <table class="table">
                <tr>
                    <td>
                        <!-- Kullanıcı adını value ya ekliyoruz-->
                        <input type="text" ID="txtKadi" name="txtKadi" class="form-control" placeholder="Kullanıcı adı" value='<?php echo $sonuc['kadi'] ?>'/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="password" ID="txtParola" name="txtParola" class="form-control" placeholder="Parola"/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="password" ID="txtParolaTekrar" name="txtParolaTekrar" class="form-control" placeholder="Parola Tekrar"/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <?php
                        //Post varsa yani submit yapılmışsa veri tabanından kontrolü yapıyoruz.
                        if ($_POST) {

                            //Giriş formu doldurulmuşsa kontrol ediyoruz
                            $txtKadi = $_POST["txtKadi"]; //Kullanıcı adını değişkene atadık
                            $txtParola = $_POST["txtParola"]; //Parolayı değişkene atadık
                            $txtParolaTekrar = $_POST["txtParolaTekrar"]; //Parolayı değişkene atadık

                            //Verilerin düzgün girilip girilmediğini kontrol ediyoruz
                            if ($txtParola == $txtParolaTekrar && $txtParola != '' && $txtKadi != '') {
                               //şifrelemeyi yapıyoruz
                                $txtParola = md5('56' . $txtParola . '23');
                                if ($sorgu2 = $baglanti->query("UPDATE kullanicilar SET kadi='$txtKadi', parola='$txtParola' WHERE  id=$id")) {
                                    header("location:index.php"); //güncelleme başarılı ise sayfayı yönlendiriyoruz
                                } else {
                                    echo 'bir hata oldu tekrar deneyin';
                                }
                            } else {
                                //eğer kullanıcı adı ve parola boş ve paralolar uyuşmuyorsa
                                //hata mesajı verdiriyoruz
                                echo "Alanları düzgün doldurunuz";
                            }
                        }
                        ?>
                    </td>
                </tr>
                <tr>
                    <td class="text-center">
                        <input type="submit" class="btn btn-primary btn-block" ID="btnGiris" value="Kaydet"/>
                    </td>
                </tr>
            </table>
        </div>
    </div>
</form>
</body>
</html>

 

user Edit

 

 

userDelete.php sayfası ile de kullanıcı siliyoruz. Burada id değerinin get ile alıp sorguda o id yi siliyoruz.

<?php
session_start(); //oturum başlattık
//eğer mevcut oturum yoksa sayfayı yönlendiriyoruz.
if(!isset($_SESSION["Oturum"]) || $_SESSION["Oturum"]!="6789")
{
   header("location:login.php");
}
if($_GET)
{
include("inc/vt.php");
$id=(int)$_GET["id"]; //silinecek id yi get ile alıyoruz

//silme sorgumuzu çalıştırıyoruz
$sorgu=$baglanti->query("delete from kullanicilar where id=$id");
//index.php sayfamıza geri dönüyoruz
header("location:index.php");
}
?>

Kullanıcı Adı: admin

Parola: 1234

Kullanıcı bilgilerini veritabanından elle değiştirmeyin sistemden ekleyip düzenleyin!

Bu uygulama ile oturum yönetimi ve çerez kullanımını gördünüz. Kendinize göre özelleştirerek bir çok uygulamanızda kullanabilirsiniz.

Uygulama dosyaları ve veri tabanını indirmek için: login_php.zip

Paylaş:

Yorumlar

  1. Merhabalar; paylaşımınız için teşekkürler. Yalnız benim bir problemim var, kullanıcı adını ve şifresini doğru girmeme rağmen sisteminiz, kullanıcı adı parola yanlış döndürüyor.

    1. Tüm testlerini yapmıştım, örneği doğrudan alıp test edin ondan sonra sisteminize entegre edin.

  2. Paylaşımınız için teşekkürler, bunu PDO ile nasıl yapabilirim

    1. Zaman bulursam pdo lu şeklinide yayınlarım.

  3. Fatal error: Uncaught Error: Call to a member function fetch_assoc() on boolean in C:\xampp\htdocs\sitem\Login.php:80 Stack trace: #0 {main} thrown in C:\xampp\htdocs\sitem\Login.php on line 80 böyle bir hata veriyor nasıl çözebilirim yardımcı olurmusunuz

    1. Veri tabanını doğru yülediğinden emin ol ve sorguyu değiştirdiysen sorgunun doğruluğundan emin ol.

  4. Kolay kullanıcı adı ve parola sürekli hatalı diyor panel da girsek aynısı oluyor

    1. Veri tabanı ayarlarını doğru yaptığınıza emin olun.

  5. Merhaba hocam içeriğin detayları için teşekkürler. Fakat bir sorunum var bağlantıları gayet düzgün yapmama rağmen kullanıcı adı ve şifre hata veriyor hiç bir şekilde giremiyorum

    1. Tekrar kontrol ettim sorunsuz çalışıyor.

  6. Hocam merhaba Kendi bilgisayarımda denedim gayet güzel çalıştı fakat Web e attığım zaman kullanıcı login ekranı yerine direk index sayfasına giriyor. Anlayamadım

    1. Farklı tarayıcıda deneyiniz.

  7. hocam herşeyi doğru yapmama rağmen /admin/ ile girince direk admin panele giriyor. parola vs sormuyor, login.php girip k.adi vs doğru giriyorum fakat giriş yapmıyor. logout.php ile çıkışyaptığımızdada. logout.php sayfasında kalıyor. sorunu bir türlü bulamadım.

    1. Buradaki eğitim videolarını izlerseniz login kısmını nasıl yapacağınızı anlarsınız.