Last updated on 16 Aralık 2020
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:
- Kayıt Ol
- Giriş yap
- Çı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:
- id => integer tipinde. AUTO_INCREMENT
- username => varchar tipinde
- 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ı
- includes
- header.php
- footer.php
- settings
- Database.php
- class.User.php
- index.php
- login.php
- register.php
- 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.
- Register: Kullanıcı kayıt etmek için kullanılacak metot
- Login: Kullanıcı girişi için kullanılacak metot
- 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.
- username: Kullanıcı adı
- password: Şifre
- 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.
- username: Kullanıcı adı
- 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');
Çok başarılı anlatmışsınız teşekkür ederiz
Çok iyiymiş bende php yazıyorum.
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
Tasarım konusunda çok haklısınız değişikliğe gideceğim.
guzel paylasımda bulunmussunuz
Sağ olun teşekkür ederiz. <3
Paylaşımınız ve anlamınız gayet güzel. Başarılarınızın devamını dilerim.
I conceive you have remarked some very interesting details , thanks for the post. Valentia Valentijn Tingley