Kullanıcı Yönetimi PHP

Kullanıcı Yönetimi

Merhaba arkadaşlar,

Bu yazımızda kullanıcı yönetimini örnekleyen bir uygulama gerçekleştireceğiz. Bu uygulamamızda veritabanı ile iletişim kurarak içersinde:

  1. Kayıt Ol
  2. Giriş yap
  3. Çıkış Yap

özellikleri bulunan bir örnek uygulama geliştireceğiz.


Veritabanı Oluşturma

Örneğimizde veritabanı ile iletişim kuracağımız için ilk olarak bir adet veritabanı oluşturalım (Ben bu örneğimiz için demo adında bir veritabanı oluşturacağım. ).

Oluşturduğumuz veritabanına bir adet User adında tablo ekleyelim. Tablomuzda 3 adet satır bulunacaktır bu satırlar:

  1. id => integer tipinde. AUTO_INCREMENT
  2. username => varchar tipinde
  3. password => varchar tipinde
CREATE TABLE `user` (
  `id` int(11) NOT NULL,
  `username` varchar(254) COLLATE utf8_turkish_ci NOT NULL,
  `password` varchar(254) COLLATE utf8_turkish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci;

SQL komutu ile oluşturmak isteyenler için tablonun SQL kodunu yukarıda belirttim.


Proje Klasör Yapısı

  1. includes
    1. header.php
    2. footer.php
  2. settings
    1. Database.php
    2. class.User.php
  3. index.php
  4. login.php
  5. register.php
  6. logout.php

şeklinde olacaktır. Bu sayede projemizi daha düzgün bir şekilde yönetebileceğiz.


settings/Database.php

Database.php dosyamızın içerisinde veritabanına bağlanma işlemini gerçekleştireceğiz. Bunun için Database isminde bir sınıf oluşturalım. Oluşturduğumuz sınıfın içerisinde veritabanına bağlanmamız için gerekli olacak temel değişkenleri tanımlayalım.

  • host: Veritabanı sunucumuz. (localhost)
  • db: Veritabanı adımız. (demo)
  • user: Veritabanı kullanıcı adımız. (root)
  • pass: Veritabanı şifremiz. (boş)

Değişkenlerimizi oluşturduktan sonra yapıcı metodumuz (__construct) içerisinde değişkenlere uygun değerleri değerlerimizi atayalım.

Veritabanı bağlantımız için connect adında bir metot oluşturalım ve PHP PDO özelliği ile bağlantımızı gerçekleştirelim. Oluşturduğumuz bağlantıyı metot dışarısına return (geri döndürmek) edelim.

<?php 
class Database  
{
    private $host;
    private $db;
    private $user;
    private $pass;
    public function __construct()
    {
        $this->host = "localhost";
        $this->db   = "demo";
        $this->user = "root";
        $this->pass = "";
    }
    public function connect()
    {
        $conn = new PDO("mysql:host=".$this->host.";dbname=".$this->db.";", $this->user, $this->pass);
        return $conn;
    }
}

settings/class.User.php

class.User.php dosyamızın içerisine ilk olarak veritabanımızı (Database.php) dahil edelim. Ardından User adında bir sınıf oluşturalım.

Oluşturduğumuz sınıfımızın içerisine bir adet değişken oluşturalım.

  • conn: Veritabanı nesnemizin tutulacağı değişken

Sınıfın kurucu metodunda (__construct) Database sınıfımızda yeni bir nesne oluşturalım ve bu nesnemizin connect metodunu sınıfımızın içerisinde oluşturduğumuz conn nesnesine atayalım.

Veritabanı nesnemizi de oluşturduğumuza göre sınıfımızda olacak fonksiyonları belirleyebiliriz.

  1. Register: Kullanıcı kayıt etmek için kullanılacak metot
  2. Login: Kullanıcı girişi için kullanılacak metot
  3. Logout: Kullanıcı çıkışı için kullanılacak metot

Sınıfımızı oluşturmaya ilk olarak Register metotu ile başlayalım.

settings/class.User.php Register Metodu

Register metodu ile veritabanımıza yeni bir kullanıcı ekleyeceğiz. Kullanıcı ekleyebilmek için gerekli olan verilerin neler olduğunu tespit edelim.

  1. username: Kullanıcı adı
  2. password: Şifre
  3. rePassword: Şifre tekrarı

Kullanıcıdan 3 adet değer alacağız ve bu alacağımız değerleri kontrol edeceğiz.

İlk olarak kullanıcıdan gelen bu 3 değerin en az 4 karakter olması gerektiğini belirtelim.

Şifre ile şifre tekrar değerlerinin birbirleri ile aynı olup olmadığını kontrol edelim.

Kayıt olunmak istenen kullanıcı adı ile başka bir kullanıcı kayıtlı mı kontrol edelim.

Kontrollerimizden başarıyla geçilmesi durumunda kullanıcıdan alınan şifre değerini md5() fonksiyonu ile şifreleyelim. Oluşturulan yeni şifre ve kullanıcı adı ile veritabanımıza kayıt talebinde bulunalım.

Kaydın başarılı olması durumunda kullanıcıyı login.php yönlendirelim.

Kaydın başarısız olması durumunda kullanıcıya bir hata mesajı gösterelim.


settings/class.User.php Login Metodu

Login metodu ile kullanıcının sisteme girebilmesi için gerekli olan parametreleri belirleyelim.

  1. username: Kullanıcı adı
  2. password: Kullanıcı şifre

Kullanıcıdan gelen bu değerleri belirli şartlara göre kontrol edelim.

İlk olarak kullanıcının bize göndermiş olduğu değerlerin karakter sayılarının 4 karakterden uzun olup olmadıklarını kontrol edelim.

Gönderilen şifre değerini md5() fonksiyonu ile şifreleyelim. Oluşan şifreyi ve kullanıcı adını veritabanında kayıtlı olup olmadılarını kontrol edelim. Sorgumuzdan gelen sonuç 0’dan büyük ise kullanıcı sistemde kayıtlıdır fakat gelen değer 0’a eşit ise sistemde kayıtlı değildir.

Kullanıcı sistemde kayıtlı ise username adında bir SESSION oluşturalım ve içerisine kullanıcıdan gelen kullanıcı adını aktaralım ve index.php yönlendirelim.

Kullanıcı sisteme kayıtlı deği ise kullanıcıya hata mesajı gösterelim.


settings/class.User.php Logout

Oluşturulan SESSION değerlerini temizleyelim ve index.php yönlendirelim.


settings/class.User.php Tüm Kodları

<?php
require_once 'Database.php';
class User
{
    private $conn;
    public function __construct() {
        $conn = new Database(); 
        $this->conn = $conn->connect();
    }
    public function Register($username = '',$password = '',$rePassword = '')
    {
        $RegisterMessage= "";
        if(strlen($username) < 4 || strlen($password) < 4)
        {
            $RegisterMessage = [
                "status"    => "danger",
                "message"   => "Username or password is less than 4 characters"
            ];
            return $RegisterMessage;
        }

        if($password != $rePassword){
            $RegisterMessage = [
                "status"    => "danger",
                "message"   => "Password does not match Password Repeat."
            ];
            return $RegisterMessage;
        }

        $query = "SELECT count(username) FROM User WHERE username=:username";
        $userCount = $this->conn->prepare($query);
        $userCount->execute(array(
            'username'  => $username
        ));
        $result = $userCount->fetchColumn();
        if($result > 0)
        {
            $RegisterMessage = [
                "status"    => "warning",
                "message"   => "Such a user already exists"
            ];
            return $RegisterMessage;
        }
        $md5Password = md5($password);
        $query  = "INSERT INTO User (username,password) VALUES (:username,:password);";
        $insert = $this->conn->prepare($query);
        $status = $insert->execute(array(
            "username"  => $username,
            "password"  => $md5Password
        ));
        if($status == true)
        {
            header('Location: login.php?register=success');
        }
        else
        {
            $RegisterMessage = [
                "status"    => "danger",
                "message"   => "Database error."
            ];
            return $RegisterMessage;
        }
    }
    public function Login($username= '',$password = '')
    {
        $LoginMessage= "";

        if(strlen($username) < 4 || strlen($password) < 4)
        {
            $LoginMessage = [
                "status"    => "danger",
                "message"   => "Username or password is less than 4 characters"
            ];
            return $LoginMessage;
        }
        $md5Password = md5($password);

        $query = "SELECT count(username) FROM User WHERE username=:username AND password=:password";
        $userCount = $this->conn->prepare($query);
        $userCount->execute(array(
            'username'  => $username,
            'password'  => $md5Password
        ));
        $result = $userCount->fetchColumn();
        if($result > 0){ 
            $_SESSION['username'] = $username;
            header('Location: index.php');
        } else { 
            $LoginMessage = [
                "status"    => "danger",
                "message"   => "Username or password is wrong."
            ];
            return $LoginMessage;
        }
    }
    public function Logout(){
        session_destroy();
    }
}

İncludes/header.php

İlk olarak SESSION ve Tampon değerimizi başlatım. Ardından örneğimizin güzel gözükmesi açısından Bootstrap ekleyelim.

<?php
ob_start();
session_start();
?>
<!doctype html>
<html lang="tr">
<head>

    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <title>User Management</title>
</head>
<body class="mt-3">
    <div class="container">
        <h3 class="text-center">Engin Yenice</h3>

İncludes/footer.php

Eklediğimiz Bootstrap devamında bulunan scriptleri bu kısma ekleyelim.

</div>

<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js" integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shuf57BaghqFfPlYxofvL8/KUEfYiJOMMV+rV" crossorigin="anonymous"></script>
</body>
</html>

İndex.php

Sayfamızın başına ilk olarak header.php dahil edelim. Ardından SESSION olup olmadığını kontrol edelim.

SESSION varsa eğer ekrana Hoşgeldin [Kullanıcı Adı] şeklinde bir mesaj versin ve bir çıkış butonu bulunsun.

SESSION yoksa eğer giriş yap ve kayıt ol butonları görünsün şeklinde şart koşalım.

<?php
include 'includes/header.php';
?>
    <?php
if(isset($_SESSION['username']))
{ ?>
    <div class="text-center">
        <hr>
        <h4 class=""><i>Hoşgeldin </i> <strong><?=$_SESSION['username']?></strong></h4>
        <a href="logout.php" class="btn btn-outline-danger text-center">Çıkış Yap</a>
        <hr>
    </div>
    <?php } else { ?>
    <div class="d-flex justify-content-center">
        <div class="buttons">
            <a href="login.php" class="btn btn-outline-primary">Login</a>
            <a href="register.php" class="btn btn-outline-success">Register</a>
        </div>
    </div>
    <?php
}
    ?>
<?php
include 'includes/footer.php';
?>

Login.php

Sayfamızın başına ilk olarak header.php dahil edelim. Ardından SESSION olup olmadığını kontrol edelim.

SESSION olması durumunda kullanıcıyı index.php yönlendirelim.

Kullanıcının giriş bilgilerini dolduracağı bir form oluşturalım ve ardından bu formun post edilmesi durumunda ilk olarak User sınıfını sayfaya dahil edelim ve ardından User sınıfının Login metoduna gerekli değerleri gönderelim. Bu metotdan dönen değeri statusMessage adında bir değişkene aktaralım. Ardından bu değişkendeki bilgileri kullanıcıya gösterelim.

<?php
include 'includes/header.php';
if(isset($_SESSION['username']))
{
    header('Location: index.php');
}
if(isset($_POST['login']))
{
    require_once("settings/class.User.php");
    $User = new User();
    $userName   = htmlspecialchars(trim($_POST['username']));
    $password   = htmlspecialchars(trim($_POST['password']));
    $statusMessage = $User->Login($userName,$password);
    ?>
    <div class="alert alert-<?=$statusMessage['status']?>"><?=$statusMessage['message']?></div>
<?php }
if(isset($_GET['register']) && $_GET['register'] == "success")
{ ?>
    <div class="alert alert-success">Registration Successful</div>
<?php } ?>
<h3>Login Page</h3>
<form method="post" action="" >
    <div class="form-group">
        <label>Username</label>
        <input type="text" name="username" class="form-control">
    </div>
    <div class="form-group">
        <label>Password</label>
        <input type="password" name="password" class="form-control">
    </div>
    <button type="submit" name="login" class="btn btn-primary">Login</button>
    <a href="index.php" class="btn btn-secondary">Back</a>
</form>
<?php
include 'includes/footer.php';
?>

Register.php

Sayfamızın başına ilk olarak header.php dahil edelim. Ardından SESSION olup olmadığını kontrol edelim.

SESSION olması durumunda kullanıcıyı index.php yönlendirelim.

Kullanıcının giriş bilgilerini dolduracağı bir form oluşturalım ve ardından bu formun post edilmesi durumunda ilk olarak User sınıfını sayfaya dahil edelim ve ardından User sınıfının Register metoduna gerekli değerleri gönderelim. Bu metotdan dönen değeri statusMessage adında bir değişkene aktaralım. Ardından bu değişkendeki bilgileri kullanıcıya gösterelim.

<?php
include 'includes/header.php';
if(isset($_SESSION['username']))
{
    header('Location: index.php');
}
if(isset($_POST['register']))
{
    require_once("settings/class.User.php");
    $User = new User();
    $userName   = htmlspecialchars(trim($_POST['username']));
    $password   = htmlspecialchars(trim($_POST['password']));
    $rePassword = htmlspecialchars(trim($_POST['rePassword']));
    $statusMessage = $User->Register($userName,$password,$rePassword);
    ?>
    <div class="alert alert-<?=$statusMessage['status']?>"><?=$statusMessage['message']?></div>
<?php }
?>
<h3>Register Page</h3>
<form method="post" action="" >
    <div class="form-group">
        <label>Username</label>
        <input type="text" name="username" class="form-control">
    </div>
    <div class="form-group">
        <label>Password</label>
        <input type="password" name="password" class="form-control">
    </div>
    <div class="form-group">
        <label>Re. Password</label>
        <input type="password" name="rePassword" class="form-control">
    </div>
    <button type="submit" name="register" class="btn btn-primary">Create</button>
    <a href="index.php" class="btn btn-secondary">Back</a>
</form>
<?php
include 'includes/footer.php';
?>

Logout.php

İlk olarak SESSION ve Tampon değerimizi başlatım. User sınıfını sayfaya dahil edelim ve bu sınıftan bir adet nesne oluşturalım ardından User sınıfının Logout metodunu çağıralım. Bu metot sayesinde kullanıcıya ait SESSION bilgileri silinecektir. Ardından index.php yönlendirelim.

<?php
ob_start();
session_start();
require_once("settings/class.User.php");
$User = new User();
$User->Logout();
header('Location: index.php');

Yayımlayan

6 Replies to “Kullanıcı Yönetimi

  1. Ana sayfada ki Yazıların Ana Görüntüsü Çok büyük 1 sayfaya 1 tane yazı sığıyor. bir sayfa da en az 2 tane olucak şekilde küçültürsen daha iyi olur . Birde Reklamları çok vermişssin ve çok göze batıyor daha içeriklerini öne çıkarıcak şekilde konumlandırmanı tavsiye ederim

Bir cevap yazın

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