PHP ve MySQL ile Üyelik Sistemi – Bölüm 2

PHP ve MySQL ile Üyelik Sistemi – Bölüm 2

Bir önceki yazımda kısaca PHP ve MySQL ile Üyelik Sistemi mantığını anlatmıştım. Bir önceki yazımda belirttiğim üzere inanıyorum ki işin aslını/mantığını kavrar isek daha kolay anlayabilirsiniz. Bu yazımda ise kod yazacağız, işe girişeceğiz. Genel anlamda ihtiyaç duyacağım editörleri yada uygulamaları bir önceki yazımda belirttim. Tekrar yazmama gerek yok. Dilerseniz o yazımı PHP ve MySQL ile Üyelik Sistemi – Bölüm 1 okuyabilirsiniz. PHP ve MySQL ile Üyelik Sistemi için ilk yapacağımız şey, bir adet veritabanı oluşturmak ve bu oluşturduğumuz veritabanında bir adet tablo yaratmak.

PHP ve MySQL ile Üyelik Sistemi için bir Adet veritabanı oluşturalım.

Daha önce phpMyAdmin kullandıysanız, ve bilgisayarınızda php, apache, mysql üçlüsü(WamP,XamPP vb) çalışıyor ise auth_db adında bir adet veritabanı oluşturun. Teorikte istediğiniz adı verebilirsiniz. Ama yazıma göre ilerleyeceğimiz için şimdilik size tavsiyem yazıma göre ilerlemeniz ve veritabanı adı olarakta auth_db vermeniz. Eğer phpMyAdmin ile nasıl veritabanı oluşturacağınızı bilmiyor iseniz, Google da bir araştırma yapmanızda fayda var.

HeidiSQL kullananlar için nasıl veritabanı oluşturacağız ile ilgili resim aşağıdadır.

Yukarıda ki resme bakarak bir adet veritabanı oluşturabilirsiniz. Create New / Database bağlantısına tıklar iseniz, sonra ki ekranda sizden oluşturacağınız veritabanına bir isim vermenizi isteyecektir. auth_db yazın ve Ok yazan yere tıklayın. Hepsi bu.

PHP ve MySQL ile Üyelik Sistemi için bir Adet tablo oluşturalım.

auth_db adında bir adet veritabanımız var. Şimdi bir adet tablo oluşturacağız. Tablomuzun adı user olacak ve aşağıda ki alanları içerecek;

  • name: Kullanıcının adı/Varchar/Zorunlu
  • surname: Kullanıcının soyadı/Varchar/Zorunlu
  • username: Kullanıcı adı/Varchar/Unique/Zorunlu
  • password: Kullanıcının şifresi/Varchar/Zorunlu
  • created_at: Kullanıcının üye olduğu tarih/Datetime/Zorunlu Değil
  • updated_at: Kullanıcının bilgilerini güncellediği tatih/Zorunlu değil

Tek tek el ile oluşturmayın. Aşağıda ki kodu kopyalayın. phpMyAdmin yada HeidiSQL de sorgu kısmına yapıştırın. Aşağıda ki kod, size bir adet yukarıda ki bilgilerle user adlı tablo oluşturacak.

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Ad',
  `surname` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Soyad',
  `username` varchar(250) COLLATE utf8_unicode_ci NOT NULL COMMENT 'E-Posta Adresi',
  `password` varchar(250) COLLATE utf8_unicode_ci NOT NULL COMMENT 'Şifre',
  `created_at` datetime DEFAULT NULL COMMENT 'Oluşturulma Tarihi',
  `updated_at` datetime DEFAULT NULL COMMENT 'Güncellenme Tarihi',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  KEY `created_at` (`created_at`),
  KEY `updated_at` (`updated_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='User Tablosu';

HeidiSQL kullananlar aşağıda ki resme bakabilirler.

Eğer bu sql kodunu phpMyAdmin ile çalıştırırsanız sorun yok phpMyAdmin kendisi otomatik Refresh ediyor. Böylece oluşturduğunuz tabloyu hemen görebiliyorsunuz. Ama HeidiSQL kullananlar için yapmaları gereken minik bir işlem daha var. Sol kısımda bulunan ve yeni oluşturdukları auth_db veritabanını seçsinler, Mouse’un sağ tuşu ile tıklasınlar, açılan menüden Refresh yazan yere tıklasınlar. Bakınız aşağıda ki resim:

Artık auth_db adında bir adet veritabanımız ve user adında bir adet tablomuz var. Bir sonra ki adımımız ise, basit bir login.php sayfası oluşturmak.

config.php inc/config.php

Bu dosyayı inc dizinin altında oluşturacağız ve config.php de genel bazı ayarlar olacak. Örneğin MySQL bağlantı bilgilerimiz. Birde ek olarak session_start(); komutu olacak. Bu komut php ye bir oturum başlatmasını söyler. Üyelik sisteminde ki İLK en önemli satırdır. Bir kişinin oturum açıp açmadığını görmek istiyorsak, önce oturum başlatmalıyız.

config.php de bulunan diğer önemli satır ise; error_reporting(~E_DEPRECATED & ~E_NOTICE); Bu kod ile php de Hata Raporlama düzeyini ayarlıyoruz. Eğer hiçbirşey yapmaz isek, bir değiken oluşturur ve kullanmaz isek yada boş bir değişken oluşturursak PHP bunu bize bildirir. Bu bildirim bir Error yada Fatal Error olmadığı için kodlarımız çalışır, ama ekrana ekstradan yazılar yazacağı için, sitemiz düzgün görünmez. Daha doğrusu sitemizin görünümünü bozar. Bunu engellemek için yapıyoruz. Daha fazla uzatmadan config.php dosyamızın içine bakalım.

<?php
/**
 * Bu sayfanın çağrıldığı heryerde session 'ı otomatik olarak başlatıyoruz.
 */
session_start();

/**
 * Bu sayfanın çağrıldığı her yerde undefined variable hatasını almamak için,
 * hata loglarından bazılarını gizliyoruz.
 */
error_reporting(~E_DEPRECATED & ~E_NOTICE);

class Db
{
    // MySQL Host
    protected $dbHost = 'localhost';

    // MySQL Username
    protected $dbUsername = 'root';

    // MySQL Password
    protected $dbPassword = '';

    // MySQL Veritabanı Adı
    protected $dbName = 'auth_db';

    // The database connection
    protected static $connection;

    /**
     * Connect to the database
     *
     * @return mixed  Bağlantı başarısız olursa false 
     * Başarılı olursa mysqli MySQLi object instance dönecek
     */
    public function connect()
    {
        // Veritabanına bağlanmayı dene.
        if (!isset(self::$connection)) {
            self::$connection = @new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbName);
        }

        // Eğer bağlanamaz isen, false dön.
        if (self::$connection->connect_errno || self::$connection === false) {
            /**
             * Bu kısım geliştirile bilir.
             * Daha sonra dilerse hata kodu dönebilir.
             * Biz şimdilik false dönüyoruz.
             */
            return false;
        }

        self::$connection->select_db($this->dbName);
        self::$connection->set_charset("utf8");

        return self::$connection;
    }

    /**
     * Query the database
     *
     * @param $query The query string
     * @return mixed The result of the mysqli::query() function
     */
    public function query($query)
    {
        // Veritabanına Bağlan
        $connection = $this->connect();

        // Verilen Sorguyu Çalıştır.
        $result = $connection->query($query);

        return $result;
    }

    /**
     * Fetch rows from the database (SELECT query)
     *
     * @param $query string
     * @return mixed boolean döner ise hata ile karşılaştık. 
     * array döner ise sorgumuz başarıyla çalıştı.
     */
    public function select($query)
    {
        $rows = array();
        $result = $this->query($query);
        if ($result === false) {
            return false;
        }

        while ($row = $result->fetch_assoc()) {
            $rows[] = $row;
        }
        return $rows;
    }

    /**
     * Fetch esnasında hata oluşursa bu hatayı yakalıyoruz.
     *
     * @return string Veritabanı hata mesajı
     */
    public function error()
    {

        return '<br><strong>Hata Kodu:</strong> ' . self::$connection->connect_errno . ' <br><strong>Hata Mesajı:</strong> ' . self::$connection->connect_error;
    }

    /**
     * Verileri güvenli hale getiriyoruz.
     *
     * @param string $value The value to be quoted and escaped
     * @return string Verileri güvenli hale getiriyoruz.
     */
    public function quote($value)
    {
        $value = trim($value);
        $connection = $this->connect();
        return "'" . $connection->real_escape_string($value) . "'";
    }
}

 

login.php

Bunun için uzun uzadıya araştırma yapmaya, html, css, javascript yazmaya gerek yok. Hazırlardan birini kullanacağız. login.php de sadece form bulunacak, login formu ve bizden kullanıcı adı ve şifre girmemizi isteyecek. Ben hazırlardan Colorlib in yaptığı Login Formu kullanacağım. Örneğine buradan ulaşabilirsiniz. Colorlib Login Form

Yazının sonunda vereceğim. İndirmenize gerek yok. Bu login formunu birazda kendi yapımıza göre değiştirdik. Kaynak kodu aşağıda ki gibi.(Kodları inceleyin, kopyalamanıza gerek yok. Yazının sonunda gerekli tüm dosyaları indirebilirsiniz.)

<?php
/**
 * Veritabanı bağlantı bilgilerimizin olduğu sayfayı dahil ediyoruz.
 */
include_once ("inc/config.php");

$db = new Db();

/**
 * Veritabanımıza bağlanmaya çalışıyoruz.
 * Bağlanamazsak, hata mesajını ekrana yazdırıyoruz
 */
if (!$db->connect()) {
    die("Hata: Veritabanına bağlanırken bir hata oluştu." . $db->error());
}

/**
 * login_user oturum değişkeninden bilgileri alıyoruz ve
 * $user değişkenine kaydediyoruz.
 *
 * Eğer kullanıcımız oturum açmış ise, $user dolu olacak.
 * Eğer kullanıcımız daha önce oturum açmamış ise, $user boş olacak.
 */
$user = $_SESSION["login_user"];

/**
 * Kullanıcı zaten oturum açmış ise index.php ye yönlendiriyoruz.
 * $user dolu ise, yada içinde her hangi bir değer var ise, bunun anlamı kullanıcımız oturum açmış.
 * Eğer $user boş ise, bunun anlamı kullanıcımız henüz oturum açmamış
 */
if ($user) {
    header("location: index.php");
    exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Giriş Yap</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" type="image/png" href="assets/images/icons/favicon.ico"/>
    <link rel="stylesheet" type="text/css" href="assets/vendor/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="assets/fonts/font-awesome-4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" type="text/css" href="assets/fonts/Linearicons-Free-v1.0.0/icon-font.min.css">
    <link rel="stylesheet" type="text/css" href="assets/vendor/animate/animate.css">
    <link rel="stylesheet" type="text/css" href="assets/vendor/css-hamburgers/hamburgers.min.css">
    <link rel="stylesheet" type="text/css" href="assets/vendor/animsition/css/animsition.min.css">
    <link rel="stylesheet" type="text/css" href="assets/vendor/select2/select2.min.css">
    <link rel="stylesheet" type="text/css" href="assets/vendor/daterangepicker/daterangepicker.css">
    <link rel="stylesheet" type="text/css" href="assets/css/util.css">
    <link rel="stylesheet" type="text/css" href="assets/css/main.css">
</head>
<body>

<div class="limiter">
    <div class="container-login100">
        <div class="wrap-login100 p-l-85 p-r-85 p-t-55 p-b-55">
            <?php
             if ($_GET["type"] == 'success') {
                 echo '<div class="alert alert-success" role="alert"> Tebrikler! Başarıyla kayıt oldunuz. Artık oturum açabilirsiniz.</div>';
             }

            if ($_GET["type"] == 'error') {
                echo '<div class="alert alert-danger" role="alert"> Geçersiz Kullanıcı Adı/Şifre</div>';
            }
            ?>
            <form class="login100-form validate-form flex-sb flex-w" method="post" action="login_check.php">
                <span class="login100-form-title p-b-32">Account Login</span>
                <span class="txt1 p-b-11">Username</span>
                <div class="wrap-input100 validate-input m-b-36" data-validate="Kullanıcı Adı zorunludur.">
                    <input class="input100" type="text" name="username" id="username" placeholder="E-posta adresiniz.">
                    <span class="focus-input100"></span>
                </div>
                <span class="txt1 p-b-11">Password</span>
                <div class="wrap-input100 validate-input m-b-12" data-validate="Şifre zorunludur. Boş bırakılamaz.">
                    <span class="btn-show-pass"><i class="fa fa-eye"></i></span>
                    <input class="input100" type="password" name="password" id="password" placeholder="Şifreniz.">
                    <span class="focus-input100"></span>
                </div>
                <div class="flex-sb-m w-full p-b-48">
                    <div class="contact100-form-checkbox">
                        <input class="input-checkbox100" id="ckb1" type="checkbox" name="remember-me">
                        <label class="label-checkbox100" for="ckb1">Beni Hatırla</label>
                    </div>
                    <div>
                        <a href="#" class="txt3">Kahretsin Şifremi Unuttum <i class="fa fa-frown-o" aria-hidden="true"></i></a>
                    </div>
                </div>
                <div class="container-login100-form-btn">
                    <button class="login100-form-btn">Login</button>
                </div>
            </form>
        </div>
    </div>
</div>
<div id="dropDownSelect1"></div>
<script src="assets/vendor/jquery/jquery-3.2.1.min.js"></script>
<script src="assets/vendor/animsition/js/animsition.min.js"></script>
<script src="assets/vendor/bootstrap/js/popper.js"></script>
<script src="assets/vendor/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/vendor/select2/select2.min.js"></script>
<script src="assets/vendor/daterangepicker/moment.min.js"></script>
<script src="assets/vendor/daterangepicker/daterangepicker.js"></script>
<script src="assets/vendor/countdowntime/countdowntime.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>

Yukarıda ki kodu inceleyin. Özellikle de PHP kodlarını. Yorum satırlarında gerekli açıklamaları yaptım. Çok önemli olmadıkça tekrar burada açıklama yapmayacağım ve login.php de önemli sayılabilecek fazladan açıklanması gereken satırlar aşağıdadır.

$user = $_SESSION["login_user"];

Bir durum hariç, login_user oturum değişkeni her zaman boş olacaktır. Dolayısıyla $user da bir durum hariç her zaman boş olacaktır. Ne zaman dolacağını, ne zaman değer alacağını şimdilik bir kenara bırakırsak eğer BOŞ olup olmaması bizim için önemlidir. Çünkü; Boş ise kişi oturum açmamış demektir. Dolu ise kişi oturum açmış demektir.

login_user oturum değişkeni ne zaman dolu olacak, yada ne zaman değer alacak derseniz eğer; Şöyle ki, bu forma gerekli bilgileri(Kullanıcı Adı ve Şifre) girip post ederseniz eğer, bu bilgiler login_check.php dosyasına gidecek. Girilen kullanıcı adı ve şifre ile eşleşen bir kayıt bulursak, bulduğumuz kaydın bilgilerini alıp $_SESSION[“login_user”] oturum değişkenine kayıt edeceğiz. Aslında istediğimiz bilgiyi kayıt edebiliriz ama biz kullanıcın bilgilerini kayıt edeceğiz. Böylece içine doldurduğumuz bu bilgileri her zaman kullanabileceğiz.

Örneğin Kullanıcımızın/ziyaretçimizin Adı Soyadı Test User olsun. $_SESSION[“login_user”] değişkenine kullanıcımızın adını ve soyadını kayıt edersek ve de ziyaretçimiz oturum açmış ise, oturum değişkenini(session_start();) başlattığımız her sayfada “Hoşgeldin Test User” yazdırabiliriz.

Hatırlarsanız eğer, az önce yukarıda şöyle birşey söyledim. $user Boş ise kişi oturum açmamış demektir. Dolu ise kişi oturum açmış demektir. Eğer kişi zaten oturum açmış ise, aynı işlemi tekrar yapmayacağız. Kullanıcımızı index.php dosyasına yönlendireceğiz. Aşağıda ki if de bunu yapıyor. $user dolu ise, kişi zaten oturum açmış, kişiyi index.php dosyasına yönlendiriyor.

if ($user) {
    header("location: index.php");
    exit;
}

login.php de önemli kısımları hem kodlarda bulunan yorum satırlarında, hem de burada açıkladım. Bunların dışında pekte önemli birşey yok. Asıl görevini yapıyor. Asıl görevide Login Formuna girilen Kullanıcı Adı ve Şifreyi alıp, login_check.php dosyasına gönderiyor. Hepsi bu.

login_check.php

Üyelik sistemimiz de asıl işi yapan sayfa burası. Önce kodu inceleyelim.

<?php
/**
 * Created by PhpStorm.
 * User: BenVeAlem
 * Date: 2/25/2018
 * Time: 1:00 AM
 * Site: https://www.benvealem.com/
 */

/**
 * Veritabanı bağlantı bilgilerimizin olduğu sayfayı dahil ediyoruz.
 */
include_once ("inc/config.php");

$db = new Db();
/**
 * Veritabanımıza bağlanmaya çalışıyoruz.
 * Bağlanamazsak, hata mesajını ekrana yazdırıyoruz
 */
if (!$db->connect()) {
    die("Hata: Veritabanına bağlanırken bir hata oluştu." . $db->error());
}

/**
 * login_user oturum değişkeninden bilgileri alıyoruz ve
 * $user değişkenine kaydediyoruz.
 *
 * Eğer kullanıcımız oturum açmış ise, $user dolu olacak.
 * Eğer kullanıcımız daha önce oturum açmamış ise, $user boş olacak.
 *
 */
$user = $_SESSION["login_user"];

/**
 * Kullanıcı zaten oturum açmış ise index.php ye yönlendiriyoruz.
 * $user dolu ise, yada içinde her hangi bir değer var ise, bunun anlamı kullanıcımız oturum açmış.
 * Eğer $user boş ise, bunun anlamı kullanıcımız henüz oturum açmamış
 */
if ($user) {
    header("location: index.php");
    exit;
}


// login.php den gönderilen Kullanıcı adı ve Şifreyi alıyoruz.
$username = $_POST["username"];
$password = $_POST["password"];

// Varsa Sağında yada Solunda gereksiz boşluklar, bunları temizliyoruz.
$username = trim($username);
$password = trim($password);

// Kullanıcı adını güvenli hale getiriyoruz.
$username = $db->quote($username);

// Şifremizi md5 e çeviriyoruz
$password = md5($password);

// Sorgumuzu hazırlıyoruz.
$query= "SELECT * FROM user WHERE username=$username and password='$password'";

/**
 * Sorgumuzu Çalıştırıyoruz.
 */
$result = $db->select($query);

/**
 * Sorgumuzu çalıştırdıktan sonra dönen sonucu inceliyoruz.
 * Login Formundan gelen bilgiler ile, veritabanımız da bulunan bilgileri karşılaştırdık.
 * Burada ki IF ile EŞLEŞEN bir kayıt var mı diye kontrol ediyoruz.
 */
if ($result && count($result) == 1) {
    /**
     * Girilen Kullanıcı adı ve Şifre ile eşleşen bir kayıt bulduk.
     * Tanımsız olarak başlattığımız Session ı, artık tanımlaya biliriz.
     * Böylece oturum açma işlemini gerçekleştirebiliriz.
     */

    // Ihtiyaç duyduğumuz alanları login_user adlı oturum değişkenine kayıt ettik.
    // login_user oturum değişkeni ilk defa burada dulduruluyor.
    // Daha önce hep boştu. Boş olması demek, kişi oturum açmamış demektir.
    // Dolu olması demek ise, kişi oturum açmış demektir.
    // Bizde doldurmak için gerekli alanları login_user oturum değişkenine kayıt ettik.
    // Örneğin başka bir sayfa da kullanıcın adını yada soyadını almak için, burada kayıt ettiğimiz name ve surname i alacağız.
    $_SESSION["login_user"] = array(
        "id" => $result[0]["id"],
        "name" => $result[0]["name"],
        "surname" => $result[0]["surname"],
        "username" => $result[0]["username"],
        "created_at" => $result[0]["created_at"],
        "updated_at" => $result[0]["updated_at"]
    );

    /**
     * Oturum açma işlemi gerçekleşti.
     * Kullanıcıyı index.php e göndereceğiz.
     * Hatırlarsanız, index.php de oturum açma/açmama durumuna göre navbar daki linkler görünüyordu.
     * Oturum açmamış ise: Kayıt Ol, Giriş Yap görünüyordu.
     * Oturum Açmış ise: Çıkış Yap görünecekti.
     */
    header("location: index.php");
    exit;

} else {
    /**
     * Girilen Kullanıcı adı ve Şifre ile eşleşen bir kayıt bulamadık.
     * Girilen kullanıcı adı ve/veya şifre yanlış.
     * Kullanıcının tekrar denemesi için login.php ye yönlendiriyoruz.
     */
    header("location: login.php?type=error");
    exit;

}

Yukarıda ki kodu incelerseniz eğer, yorum satırlarında gerekli açıklamaları yaptım. Mantık şu; Formdan gelen Kullanıcı Adı ve Şifresini Al, Veritabanında sorgula. Eşleşen bir kayıt bulursan $_SESSION[“login_user”] oturum değişkeninin içini doldur. Oturum açma işlemi bittiğin de, kullanıcımızı index.php dosyasına yönlendir.

Eğer eşleşen bir kayıt bulamazsan, kullanıcımızı login.php ye yönlendir. Geçersiz Kullanıcı Adı ve Şifre şeklinde bir hata mesajı dön.

Sırada ki sayfamız ise register.php.

register.php

Bu sayfanın görevi basit. Bir üyelik formu hazırladık. Kullanıcılarımız girecek, bu sayfada ki üyelik formunu dolduracak. Tüm alanları eksiksiz doldururlarsa eğer, kişiyi kayıt edeceğiz. Eksik alanlar olursa, bunu ekranda göstereceğiz ve ziyaretçimize eksik alanları doldurmasını söyleyeceğiz. Kişi kayıt olduktan sonra artık oturum açabilir duruma gelecek. register.php nin içeriği aşağıda ki gibidir. Kodları inceleyelim.

<?php
/**
 * Created by PhpStorm.
 * User: BenVeAlem
 * Date: 2/25/2018
 * Time: 1:00 AM
 * Site: https://www.benvealem.com/
 */

/**
 * Veritabanı bağlantı bilgilerimizin olduğu sayfayı dahil ediyoruz.
 */
include_once("inc/config.php");

$db = new Db();
/**
 * Veritabanımıza bağlanmaya çalışıyoruz.
 * Bağlanamazsak, hata mesajını ekrana yazdırıyoruz
 */
if (!$db->connect()) {
    die("Hata: Veritabanına bağlanırken bir hata oluştu." . $db->error());
}

/**
 * login_user oturum değişkeninden bilgileri alıyoruz ve
 * $user değişkenine kaydediyoruz.
 *
 * Eğer kullanıcımız oturum açmış ise, $user dolu olacak.
 * Eğer kullanıcımız daha önce oturum açmamış ise, $user boş olacak.
 *
 */
$user = $_SESSION["login_user"];

/**
 * Kullanıcı zaten üye olmuş ve
 * Oturum açmış ise, index.php ye yönlendiriyoruz.
 */
if ($user) {
    header("location: index.php");
    exit;
}


/**
 * Yapılan işlemi kontrol et.
 * Eğer işlem POST ise, kullanıcının forma girdiği bilgileri al.
 */
if ($_POST) {
    /**
     * Varsayılan olarak hata durumunu ve
     * Hata mesajını false/null olarak ayarla.
     * Hata bulursak bu değişkenleri dolduracağız.
     */
    $error = false;
    $errors = array();

    /**
     * Form dan gelen bilgileri al
     */
    $name = $_POST["name"];
    $surname = $_POST["surname"];
    $username = $_POST["username"];
    $password1 = $_POST["password1"];
    $password2 = $_POST["password2"];

    /**
     * Varsa değişkenlerde gereksiz boşluklar.
     * Bu boşlukları siliyoruz.
     */
    $name = trim($name);
    $surname = trim($surname);
    $username = trim($username);
    $password1 = trim($password1);
    $password2 = trim($password2);


    // ======== Basit Kontrolleri Gerçekleştir. ========
    /**
     * İsim girmiş mi ?
     */
    if (empty($name)) {
        /**
         * Hata yakaladık.
         * Vatandaş adını girmemiş.
         */
        $error = true;
        $errors[] = 'Lütfen adınızı girin. Bu alan boş bırakılamaz.';
    }

    /**
     * Soyisim girmiş mi ?
     */
    if (empty($surname)) {
        /**
         * Hata yakaladık.
         * Vatandaş Soyisim girmemiş.
         */
        $error = true;
        $errors[] = 'Lütfen Soyisim girin. Bu alan boş bırakılamaz.';
    }

    /**
     * Kullanıcı Adı/E-Posta Girmiş mi ?
     */
    if (empty($username)) {
        /**
         * Hata yakaladık.
         * Vatandaş kullanıcı adı girmemiş.
         */
        $error = true;
        $errors[] = 'Lütfen bir kullanıcı adı girin. Bu alan boş bırakılamaz.';
    }

    /**
     * Şifreler eşleşiyor mu kontrol et.
     */
    if ($password1 != $password2) {
        /**
         * Hata bulduk.
         * Şifreler eşleşmiyor.
         */
        $error = true;
        $errors[] = 'Şifreler Eşleşmiyor.';
    }

    /**
     * Şifre 4 karakterden uzun mu ?
     */
    if (strlen($password1) < 4) {
        /**
         * Hata bulduk.
         * Şifre 4 karakter yada daha küçük.
         */
        $error = true;
        $errors[] = 'Şifre en az 5 karakter olmalıdır.';
    }

    /**
     * Şu ana kadar eğer hiçbir hata ile karşılaşmadıysak
     * Ekleme işlemini yapacağız.
     * Eğer hata varsa ekleme işlemini yapmayacağız.
     *
     * Burada kafanız karışmasın.
     * $error ın ilk değeri false idi. Yani hata yok demekti.
     * Eğer hiç hata bulamadıysak değeri hala false kalacak.
     *  if de başında ! işarati değeri ters çevirecek.
     * Eğer hiç hata bulamazsak $error değeri false 'tur. Ama !$error un değeri TRUE dur.
     * true olunca if in içerisine girecek. ve Register işlemini yapacak.
     *
     * Eğer hata bulursak $error true olacak, !$error ise false olacak. Dolayısıyla if in içine girmeyecek.
     *
     */
    if (!$error) {
        /**
         * Bu bilgileri güvenli hala getir.
         */
        $name = $db->quote($name);
        $surname = $db->quote($surname);
        $username = $db->quote($username);
        $password = md5($password1);

        $sorgu = "INSERT INTO user (name,surname,username,password,created_at,updated_at) VALUES ($name,$surname,$username,'$password',NOW(), NOW());";

        $db->query($sorgu);

        header("location: login.php?type=success");
        exit;


    }
}
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css">
    <title>Kayıt Ol</title>
</head>
<body>
<nav class="navbar navbar-dark bg-dark navbar-expand-lg">
    <a class="navbar-brand" href="http://localhost/">BenVeAlem</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="nav navbar-nav ml-auto">
            <?php
            if ($user) {
                echo '<li class="nav-item"><a class="nav-link" href="http://localhost/logout.php">Çıkış Yap</a></li>';
            } else {
                echo '
                        <li class="nav-item"><a class="nav-link" href="http://localhost/register.php">Kayıt Ol</a></li>
                        <li class="nav-item"><a class="nav-link" href="http://localhost/login.php">Giriş Yap</a></li>';
            }
            ?>
        </ul>
    </div>
</nav>
<div class="container">
    <div class="row">
        <div class="col-md-12"><hr></div>
        <div class="col-md-12">
            <h3>Kayıt Ol</h3>
            <form method="post" action="register.php">
                <div class="form-group">
                    <label for="exampleInputEmail1">Ad</label>
                    <input type="text" name="name" id="name" class="form-control" placeholder="Adınız" value="<?php echo $name;?>">
                </div>
                <div class="form-group">
                    <label for="exampleInputEmail1">Soyad</label>
                    <input type="text" name="surname" id="surname" class="form-control" placeholder="Soyadınız" value="<?php echo $surname;?>">
                </div>
                <div class="form-group">
                    <label for="exampleInputEmail1">Kullanıcı Adı</label>
                    <input type="email" class="form-control" id="username" name="username" placeholder="E-Posta adresiniz" value="<?php echo $username;?>">
                </div>
                <div class="form-group">
                    <label for="exampleInputPassword1">Şifre</label>
                    <input type="password" class="form-control" id="password1" name="password1" placeholder="Şifre" value="<?php echo $password1;?>">
                </div>
                <div class="form-group">
                    <label for="exampleInputPassword1">Şifre - Tekrar</label>
                    <input type="password" class="form-control" id="password2" name="password2" placeholder="Şifre(Tekrar)" value="<?php echo $password2;?>">
                </div>
                <button type="submit" class="btn btn-primary">Kayıt İşlemini Tamamla</button>
            </form><hr>
            <?php
            /**
             * Eğer Method Post ise
             */
            if ($_POST) {
                /**
                 * Hata durumunu kontrol et.
                 */
                if ($error) {
                    /**
                     * Eğer hata var ise,
                     * Toplam hata adedini bul.
                     * Ve ekrana yazdır.
                     */
                    $totalError = count($errors);
                    echo '<div class="alert alert-danger" role="alert">' . $totalError . ' Hata bulundu. Lütfen bu hataları giderin ve tekrar deneyin.</div>';

                    /**
                     * Tek tek hataları ekrana yaz.
                     */
                    foreach ($errors as $err) {
                        echo '<div class="alert alert-warning" role="alert">' . $err . '</div>';
                    }
                }
            }
            ?>
        </div>
    </div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

Yorum satırlarında gerekli açıklamaları yaptım. Bu nedenle uzatmayacağım. Şimdi ki sırada ki sayfamıza geçebiliriz: protected.php

protected.php

Üyelik sistemimizin çalışıp çalışmadığını test etmeye yarayan basit bir sayfa. Oturum açmadan bu sayfayı ziyaret edeseniz, sizi login.php dosyasına yönlendirecek. Sadece oturum açmış kullanıcılarımız bu sayfayı görecek. Kodu ise aşağıdadır. Diğer sayfalardan pek bir farkı yok.

<?php
/**
 * Veritabanı bağlantı bilgilerimizin olduğu sayfayı dahil ediyoruz.
 */
include_once ("inc/config.php");

$db = new Db();
/**
 * Veritabanımıza bağlanmaya çalışıyoruz.
 * Bağlanamazsak, hata mesajını ekrana yazdırıyoruz
 */
if (!$db->connect()) {
    die("Hata: Veritabanına bağlanırken bir hata oluştu." . $db->error());
}

/**
 * login_user oturum değişkeninden bilgileri alıyoruz ve
 * $user değişkenine kaydediyoruz.
 *
 * Eğer kullanıcımız oturum açmış ise, $user dolu olacak.
 * Eğer kullanıcımız daha önce oturum açmamış ise, $user boş olacak.
 *
 */
$user = $_SESSION["login_user"];

/**
 * Bu sayfayı sadece Oturum Açmış Kullanıcılar Görebilir.
 * Eğer kişi oturum açmamış ise login.php ye gönderiyoruz.
 */
if (!$user) {
    header("location: login.php");
    exit;
}
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css">
    <title>Hello, world!</title>
</head>
<body>
<nav class="navbar navbar-dark bg-dark navbar-expand-lg">
    <a class="navbar-brand" href="http://localhost/">BenVeAlem</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="nav navbar-nav ml-auto">
            <?php
                if ($user) {
                    echo '<li class="nav-item"><a class="nav-link" href="http://localhost/logout.php">Çıkış Yap</a></li>';
                } else {
                    echo '
                        <li class="nav-item"><a class="nav-link" href="http://localhost/register.php">Kayıt Ol</a></li>
                        <li class="nav-item"><a class="nav-link" href="http://localhost/login.php">Giriş Yap</a></li>';
                }
            ?>


        </ul>
    </div>
</nav>
    <div class="container">
        <div class="row">
            <div class="col-md-12"><hr></div>
            <div class="col-md-12">
                <div class="alert alert-info" role="alert">
                    <?php
                    if ($user) {
                        echo 'Tebrikler! Oturum açtınız.';
                    }
                    ?>
                    <hr>
                    Bu sayfayı sadece Oturum Açmış Kullanıcılarımız Görebilir.
                </div>
            </div>
            <div class="col-md-12">
                <h1>Hello, world!</h1>
            </div>
        </div>
    </div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

Geldik son sayfamıza, index.php

index.php

Bu sayfada diğerlerinden farklı değil. Hemen hemen aynı. protected.php dosyamızı sadece oturum açmış kullanıcılar görebiliyordu. Bu sayfayı hem oturum açmış kullanıcılarımız hemde oturum açmamış kullanıcılarımız görebiliyor. Bazı farklarla, şöyle ki;

Eğer kullanıcımız oturum açmamış ise, navbar da Kayıt Ol ve Giriş Yap diye iki bağlantı görecek.
Eğer kullanıcımız oturum açmış ise, navbar da Kayıt Ol ve Giriş Yap görünmeyecek. Malum zaten üye olmuş ve giriş yapmış, dolasıyla bu iki linki gizleyeceğiz. Bunun yerine Çıkış Yap ile Üyelere Özel Sayfa(protected.php) adında iki link görecek.

Kodu aşağıdadır, inceleyin lütfen;

<?php
/**
 * Created by PhpStorm.
 * User: BenVeAlem
 * Date: 2/25/2018
 * Time: 1:00 AM
 * Site: https://www.benvealem.com/
 */

/**
 * Veritabanı bağlantı bilgilerimizin olduğu sayfayı dahil ediyoruz.
 */
include_once ("inc/config.php");

$db = new Db();
/**
 * Veritabanımıza bağlanmaya çalışıyoruz.
 * Bağlanamazsak, hata mesajını ekrana yazdırıyoruz
 */
if (!$db->connect()) {
    die("Hata: Veritabanına bağlanırken bir hata oluştu." . $db->error());
}
/**
 * $user değişkeni varsayılan olarak tanımsızdır.
 * Eğer kullanıcımız oturum açmış ise, login_user oturum değişkeni doludur.
 * login_user oturum değişkeninin değerini alıyoruz $user a kayıt ediyoruz.
 *
 * Eğer $user null yada false ise bunun anlamı kişi oturum açmamış.
 */
$user = $_SESSION["login_user"];

/**
 * Bir kişinin oturum açıp açmadığını aşağıda ki şekilde kontrol edebiliriz.
 * Aşağıda ki kodları inceleyin.
 * Yorum satırı olarak bırakın.
 */
//    if ($user) {
//        // Kişi oturum açmış
//        die("Oturum Açmışsınız");
//    } else {
//        // Kişi oturum açmamış.
//        die("HATA: Oturum Açın");
//    }

?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/css/bootstrap.min.css">
    <title>Hello, world!</title>
</head>
<body>
<nav class="navbar navbar-dark bg-dark navbar-expand-lg">
    <a class="navbar-brand" href="http://localhost/">
        <?php
        if ($user) {
            echo $user["name"].' '.$user["surname"];
        } else {
            echo 'BenVeAlem';
        }
        ?>
    </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="nav navbar-nav ml-auto">
            <?php
                if ($user) {
                    echo '<li class="nav-item"><a class="nav-link" href="http://localhost/protected.php">Üyelere Özel Sayfa</a></li>';
                    echo '<li class="nav-item"><a class="nav-link" href="http://localhost/logout.php">Çıkış Yap</a></li>';
                } else {
                    echo '
                        <li class="nav-item"><a class="nav-link" href="http://localhost/register.php">Kayıt Ol</a></li>
                        <li class="nav-item"><a class="nav-link" href="http://localhost/login.php">Giriş Yap</a></li>';
                }
            ?>


        </ul>
    </div>
</nav>
    <div class="container">
        <div class="row">
            <div class="col-md-12"><hr></div>
            <div class="col-md-12">
                <div class="alert alert-info" role="alert">
                    <?php
                    if ($user) {
                        echo 'Hoş Geldin: ' . $user["name"] . ' ' . $user["surname"];
                        echo '<br>Tebrikler! Oturum açtınız.';
                    } else {
                        echo 'Henüz oturum açmadınız. Oturum açmak için login.php sayfasına gidebilirsiniz.';
                    }
                    ?>
                </div>
            </div>
            <div class="col-md-12">
                <h1>Hello, world!</h1>
            </div>
        </div>
    </div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>

logout.php

Bu sayfanın görevi basit. Kullanıcın var olan oturumunu sonlandırmak, ve kullanıcıyı index.php dosyasına yönlendirmek. Kodları inceleyebilirsiniz.

<?php
// Session u başlatıyoruz.
session_start();

// TÜM Session ları boşaltıyoruz.
$_SESSION = array();

// Session için tarayıcıya gönderilen Cookie leri expire ediyoruz.Bir nevi kullanılmaz hale getiriyoruz..
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

/**
 * Bu adımda ise tüm sessionları yok ediyoruz.
 * Kullanıcı çıkış yaptı.
 */
session_destroy();

/**
 * Son adımda ise  kullanıcıyı index.php ye gönderiyoruz.
 * Artık tekrar oturum mu açar, yoksa çıkar gider mi, kullanıcımızın kendisinin bileceği iş.
 */
header("location: index.php");
exit;

Özet – PHP ve MySQL ile Üyelik Sistemi

PHP ve MySQL ile Üyelik Sistemi yazmak istiyorsak önemli olan php nin oturum değişkenleri. Yukarıda ki kodları incelerseniz hemen hemen hepsinin aynı olduğunu görürsünüz. PHP ve MySQL ile Üyelik Sistemi yazımda en önemli sayfa login_check.php. Asıl işi bu yapıyor çünkü; bir önce ki yazımda belirtmiştim. Biz php ile oturum değişkeninin başlattığımız da php bizim için Tanımsız bir oturum değişkeni başlatır. Tanımsız yada Boş.

login_check.php dosyamız bu nedenle önemli çünkü tanımsız olan bu oturum değişkenini tanımlıyor, içini dolduruyor. Kuşkusuz diğer sayfalarda önemlidir ama işin püf noktası login_check.php.

İki bölümde yazdığım PHP ve MySQL ile Üyelik Sistemi konulu yazımın indirme linkini aşağıda bulabilirsiniz. Kodları inceleyin, test edin, geliştirin. PHP ve MySQL ile Üyelik Sistemi mantığını elimden geldiğince basit yapmaya çalıştım. Umarım bu yazı sizin için faydalı olur. Konu ile son söyleyebileceğim 3 şey ise şunlardır;

  1. PHP ve MySQL ile Üyelik Sistemi yaparken asla düz/Plain Text şifre tutmayın. ASLA!
  2. Ben örneğim de md5 kullandım, gerçek hayatta kullanmayın, mümkün ise, bcrypt kullanın. Google da arama yaparsanız eğer neleri kullanabileceğinizi görürsünüz.
  3. MVC kullanın. Yukarıda ki örnek geliştirilmeye, iyileştirilmeye muhtaçtır. Nerede Entity/Model, nerede Controller, nerede View belli değil. Herşey iç içe geçmiş. Mümkünse böyle iç içe geçmiş şekilde kod yazmayın, MVC kullanın, framework kullanın, yada kullanmak istemezseniz sağlam standartlar oluşturun. Yapıları bir birinden ayırın.

Anlamadığınız bir yer olursa lütfen sormaktan çekinmeyin.


PHP ve MySQL ile Üyelik Sistemi adlı yazımın kodlarını indirmek isterseniz, lütfen buraya TIKLAYIN.


Örnek kodlarla nasıl test edebilirim?

  1. Örnek kodları yukarıda verdiğim bağlantıdan bilgisayarınıza indirin.
  2. Zip li dosyayı WamP yada XamPP artık ne kullanıyorsanız, giriş dizinine(htdocs) çıkarın.
  3. auth_db adında bir adet veritabanı oluşturun.
  4. user adında bir adet tablo oluşturun. İndirdiğiniz dosyada user.sql dosyası var. user tablosunu oluşturmak için bunu da kullanabilirsiniz.
  5. inc/config.php dosyasına gidin. Veritabanı bilgilerinizi kontrol edin. Aynı ise sorun yok, farklı ise $dbHost, $dbUsername, $dbPassword ve $dbName değişkenlerini kendinize göre düzenleyin.
  6. register.php dosyasına gidin. Kayıt olun.
  7. login.php dosyasına gidin. Kayıt olurken girdiğiniz kullanıcı adı ve şifrenizi girin.
  8. logout.php, index.php, protected.php dosyalarını oturum açmadan ve oturum açtıktan sonra ziyaret edin. Farkları görün, kodları inceleyin.