Diğer Bölümler:
PHP İle Sıfırdan Üyelik Sistemi Kodluyoruz! - Bölüm 1
PHP İle Sıfırdan Üyelik Sistemi Kodluyoruz! - Bölüm 2
PHP İle Sıfırdan Üyelik Sistemi Kodluyoruz! - Bölüm 3
PHP İle Sıfırdan Üyelik Sistemi Kodluyoruz! - Bölüm 4
PHP İle Sıfırdan Üyelik Sistemi Kodluyoruz! - Bölüm 5 Final
Bu uygulamada:
- PHP PDO ile veritabanı bağlantısı,
- User tabloları,
- Input ve POST yöntemleri,
- Üye kayıtlarının veritabanına eklenmesi,
- Aynı mail/kullanıcı adı ile yapılmaya çalışılan üyeliklerin kontrolü,
- Session (Oturum Yönetimi),
- Üyelere özel kontrol paneli,
- Yöneticilere özel admin paneli,
- Üye banlama sistemi
yöntemlerine değineceğiz. 1.Bölümde PHP PDO ile veritabanı bağlantısını, user tablosu ve yeni üye kaydının yapımına gireceğiz. Uygulama bitince hazırladığımız dosyaları .zip formatında paylaşacağım. Vakit kaybetmeden başlayalım :)
Adım 1 - Dosyaların Açılması
Öncelikle bu sistemi ister localhost (XAMPP), ister mevcut bir hosting üzerinde hazırlayabilirsiniz. Ben localhost'da çalışacağım. İlk etapta kullanacağımız dosyaları ve kütüphaneleri hazırlamamız gerekiyor.
Açtığımız klasörleri ne amaçla kullanacağımıza değinelim:
assets: Bu klasörün içinde, css, js ve images klasörlerini açarak, ihtiyaç duyduğum kütüphane ve imajları bu klasörde tutacağız.
content: Bu klasörde Header ve Footer dosyalarını oluşturacağız. Nitekim açacağımız her sayfada tekrar tekrar aynı kodları eklemek yerine tıpkı WordPress'te olduğu gibi, her sayfaya çekeceğimiz bir üst ve alt kısmımız olacak.
inc: Burada, veritabanı bağlantısını tanımladığımız bir ''connect'' dosyamız olacak.
index.php: Panelimizin ana sayfası olacak.
Adım 2 - Gerekli Kütüphanelerin Dahil Edilmesi
Daha hızlı ve pratik olmamız açısından çeşitli varsayılan tasarımları kütüphaneler yardımıyla sağlayabiliriz. Örneğin buton tasarımları, grid sistem, media objeleri gibi pek çok detaylı CSS gerektiren tasarımları, kütüphaneler yardımıyla pratik bir şekilde projemize dahil edeceğiz. Ben Bootstrap kütüphanesinden yararlanacağım. Nitekim Bootstrap'ın components ve grid sistemi oldukça kullanışlı.
CSS'ler
Projeme dahil edeceğim CSS'ler şu şekilde olacak:
Animasyonlar için: https://raw.githubusercontent.com/daneden/animate.css/master/animate.css
Bootstrap Kütüphanesi için: https://github.com/twbs/bootstrap/archive/v4.0.0.zip
- bootstrap.css
- bootstrap.min.css
- bootstrap-grid.css
Fontlar İçin: http://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css
JS'ler
Bootstrap JS Kütüphanesi İçin: https://github.com/twbs/bootstrap/archive/v4.0.0.zip
- bootstrap.js
- bootstrap.min.js
- bootstrap.bundle.js
jQuery İçin: https://code.jquery.com/jquery-3.4.1.min.js
Fontlar
FontAwesome Fontları İçin: https://fontawesome.com/download
Harika! İhtiyaç duyduğum materyalleri indirdiğime göre şimdi content dosyalarımı oluşturup CSS ve JS'lerimi dahil edebilirim!
Adım 3 - Content Dosyaları (Header & Footer) Hazırlanması
Her sayfada kullanacağım header ve footer dosyalarımı hazırlarken CSS dosyalarımı header'dan js dosyalarımı ise footer'dan çekeceğim ki sayfa tasarımı yüklendikten sonra jsleri yüklesin ve herhangi bir yavaşlamaya sebep olmasın.
header.php
footer.php
Adım 4 - Content Dosyalarını Çağırma
Content dosyalarımı oluşturdum ve şimdi index.php sayfama bu dosyaları çağıracağım. Ardından sayfa kaynağımdan kontrolünü sağlayacağım.
index.php
Kaynak Kontrolü
Harika! header ve footer alanlarımı başarıyla oluşturdum! Sıra geldi veritabanımızı hazırlamaya ve bağlantı kurmaya!
Adım 5 - Veritabanı Hazırlanması
Veritabanımızı hazırlarken ilk etapta ''wmaraci-uyelik'' isminde bir veritabanı oluşturuyorum. Ardından bu veritabanına ''users'' adında bir tablo açıyorum ki üye bilgilerini bu tabloda tutabileyim. Tablo içerisine sütunları açmak için ister:
''ALTER TABLE users ADD username VARCHAR(255) ...''
gibi bir sorgu çalıştırabilir isterseniz MySQL veritabanından tablo içine girip ''Yeni Sütun Ekle'' diyerek de sütunları oluşturabilirsiniz.
Tablomu ve sütunlarımı oluşturdum. Şimdi bu sütunların detayına bakalım.
id: Üye olan kullanıcıların idleri bu sütunda tutulacak. Bu sütunun INT ve AUTO_INCREMENT tanımlanması gerekir. Böylece her üyelikte elle id oluşturmak yerine sistem bunu bizim için otomatik yapacak.
username: Üyelerin üye olurken yazdığı kullanıcı adları bu tabloda tutulacak.
password: Üyelerin şifreleri MD5 formatında bu tabloda tutulacak.
mail: Üyelerin üye olurken yazdıkları mail adresi bu tabloda tutulacak.
status: Üyelerin banlanması durumunda statüleri bu tabloda tutulacak böylece statüsü banlı olan üyelere, gizlemek istediğimiz kısımları gizleyebileceğiz.
created_time: Her yeni üye eklendiği otomatik olarak üyelik tarihi ve saati bu tabloda saklanacak.
Tablomuzu da tanıdığımıza göre artık sıra geldi proje dosyalarımız ile veritabanı bağlantımızın sağlanmasına :)
Adım 6 - Veritabanı Bağlantısı
Veritabanı bağlantımız için hatırlarsanız ''inc'' adında bir klasör oluşturmuştuk. Şimdi bu klasörün içerisine ''connect.php'' adına bir dosya oluşturuyoruz.
Bağlantımızı $conn olarak tanımladık ve PDO ile localhost > wmaraci-uyelik tablosuna > root kullanıcı adı ve şifresiyle bağlandık. Localhost'da çalıştığım için root şifresi alanını boş bıraktım. Ancak siz herhangi bir root şifresi tanımladıysanız ya da hosting üzerinde bu çalışmayı gerçekleştiriyorsanız root kısmına veritabanı kullanıcı adınızı ve password kısmına kullanıcı şifresini yazmayı unutmayınız. Bağlantımı sağlayıp exec ile yapıcağım tüm işlerimleri UTF-8 uyumluluğunda göndereceğimi bildirdim. Son aşamada ise, eğer bağlantı başarılı olursa echo ile ''Bağlantı Başarılı!'', yahut bağlantı başarısız olursa echo ''Bağlantı Hatası'' diyerek $e->getMessage(); komutuyla hatanın sebebini ekranıma yazdırdım ve kontrolünü sağlıyoruz.
Harika! Veritabanı bağlantımızı başarıyla sağladık! Şimdi ise burada kullanmış olduğum bağlantı dosyamı header'a çektireceğim. Böylece hangi sayfada olursam olayım ''$conn'' kullanarak veritabanı işlemleri rahatlıkla gerçekleştireceğim.
header.php
footer.php
Gördüğünüz gibi header dosyama veritabanı bağlantımı yapacağım connect dosyasını include ettim. Ardından footer dosyama ise:
$conn = null;
ekleyerek veritabanı bağlantımı sayfa sonunda sonlandırmış oldum. Buraya kadar sorunsuzca geldiyseniz harikasınız! Sıra geldi artık bir register dosyası oluşturup üye kayıtlarımızı almaya ve veritabanında saklamaya :) Burada register.php dosyasını HTML ve PHP olarak iki ayrı başlıkta inceleyeceğiz. İlk etapta HTML kodlarımızı oluşturup üye kayıt formumuzu hazırlayacağız. İkinci etapta ise PHP ile bu formu işlevli hale getirip üye kaydımızı yapacağız.
Adım 7 - Üye Kayıt Sayfası (register.php) Hazırlanması
Bu etapta ilk olarak dizinimde ''register.php'' adında bir dosya açıyorum ve açtığım dosyaya tıpkı index.php'de yaptığım gibi content dosyalarımı çağırıyorum.
Kayıt dosyamızı başarıyla açtık ve content dosyalarımızı çağırdık. Sıra geldi kayıt formumuzu oluşturmaya. Bu kısımda dilerseniz Bootstrap kütüphanesinin hazır formlarından kullanabilir, yahut kendinize özgü bir form tasarımı kurgulayabilirsiniz. Ben Bootstrap elemanlarını kullanacağım sebebini ise birazdan anlayacaksınız :)
Kodlar:
Sayfa Çıktısı:
Gördüğünüz gibi kayıt formum basic düzeyde neredeyse hazır. Burada, bootstrap kütüphanesinden yararlanmamın temel sebebi, dikkat ettiyseniz şuana özel bir CSS dosyası oluşturmadım ve CSS kodları girmedim. Çünkü bootstrap.css dahil ettik ve böylece formumda kullanmış olduğum:
- w-100 = width: 100%;
- h-100 = height: 100%;
- d-flex = display: flex;
- flex-column = flex-direction: column;
- btn-primary = bootstrap tasarımlı buton;
vs. pek çok elemanıma ekleyeceğim CSS kodlarını bootstrap benim için zaten yapmış oldu. Ayrıca şu siteden projelerinizde kullanmak için örnek bootstrap snippetleri/tasarımları bulabilirsiniz: https://bootsnipp.com/tags/4.0.0
Evet! Formumuzu da oluşturduğumuza göre sıra geldi PHP kodlarımızı yazmaya ve üye kaydımızı almaya!
Adım 8 - Üye Kayıt Formundaki Verileri POST Etme
Bu noktada PHP ile bir takım sorgular ve koşullar hazırlayarak üye kaydı sırasında oluşabilecek hataları minimize edecek ve yeni üye kayıtlarını başarıyla oluşturacağız.
Kodlar:
if ($_POST) {
$username = $_POST['username'];
$password1 = $_POST['password1'];
$password2 = $_POST['password2'];
$mail = $_POST['mail'];
$usernamecheck = "SELECT username FROM users WHERE username = '$username'";
$usernamechecked = $conn->query($usernamecheck);
$usernamecheckfinal = $usernamechecked->rowCount();
$mailcheck = "SELECT mail FROM users WHERE mail = '$mail'";
$mailchecked = $conn->query($mailcheck);
$mailcheckfinal = $mailchecked->rowCount();
if (empty($username || $password1 || $password2 | $mail)) {
$bosalan = '
} else if (mb_strlen($password1) < 6) {
$sifreyetersiz = '
} else if ($password1 !== $password2) {
$sifreuyumsuz = '
} else if ($usernamecheckfinal > 0) {
$uyeadidolu = '
} else if ($mailcheckfinal > 0) {
$mailvar = '
} else {
try {
$passwordsecurity = md5($password1);
$userregister = "INSERT INTO users(username, password, mail, status, created_time) VALUES('$username', '$passwordsecurity', '$mail', '1', NOW())";
$conn->exec($userregister);
header("location: register.php?type=success");
} catch (PDOException $e) {
header("location: register.php?type=error");
echo $e->getMessage();
}
}
}
Şimdi burada ne yaptığımıza kısaca değinelim:
Öncelikle if($_POST) diyerek eğer sayfada post olursa bu işlemleri başlatmasını söyledik.
Ardından post işlemi gerçekleşirse formumuzun post ettiği verileri tanımladım örneğin:
- $username = $_POST['username'];
diyerek, formdan gönderilen ''username'' nameine sahip inputu '$username' değişkeninin içine yaz dedik. Bu şekilde tüm inputlarımızı tanımlamış olduk.
Ardından iki farklı sorgu yazdık. $usernamecheck ve $mailchecke. Bu sorgularla yaptığımız işlem, kullanıcının post ettiği yani yazdığı kullanıcı adı veya mail adresinin daha önce veritabanımızda kaydının olup olmadığıdır. Birazdan koşul kısmında bu sorgularımızı kullanacağız.
İlk koşulumuzda yani:
- if (empty($username || $password1 || $password2 | $mail))
diyerek; Eğer, username VEYA password1 VEYA password2 VEYA mail alanı boşsa ''Kayıt başarısız! Lütfen boş alanları doldurun!'' uyarısını yazdırdık.
Bir sonraki koşulumuzu else if ile yazdık yani yukarıdaki ''hata'' koşulumuz sağlanmıyorsa sırasıyla bu koşula bakacak. Bu koşulda ise:
- else if (mb_strlen($password1) < 6)
diyerek, girilen şifrenin 6 haneden küçük olup olmadığını kontrol ettik. strelen fonksiyonu bizim girilen inputtaki karakter sayısını saymamızı sağladı. Eğer 6 haneden küçük bir şifre seçildiyse ''Kayıt başarısız! Lütfen en az 6 karakterli bir şifre seçin!'' uyarısını yazdırdık.
Sonraki koşulumuzda yine yukarıdaki iki koşul da sağlanmıyor yani hata yoksa:
- else if ($password1 !== $password2)
diyerek şifre alanlarına girilen şifrelerin birbiriyle aynı olup olmadığını kontrol ettik ve şifreler uyuşmuyorsa ''Şifreler eşleşmiyor!'' hatasını yazdırdık.
Bir sonraki koşul ise yukarıda yazdığımız sorgulardan faydalanacağımız bir koşul:
- else if ($usernamecheckfinal > 0)
Yukarıdaki sorguda, üye olacak kişinin girdiği üye adını veritabanında aratıp çıkan satırları saydırmıştık. Buradaki koşulumuzda ise eğer 0'dan büyük bir satır çıktıysa yani o isimde bir kayıt yapıldıysa ''Kayıt başarısız! Bu üye adı daha önce alınmış!'' uyarısını ekrana yazdırdık.
Son koşulumuzda ise:
- else if ($mailcheckfinal > 0)
diyerek yine aynı mantıkla mail adresini kontrol edip, eğer aynı mail adresiyle daha önce bir kayıt oluşturulmuşsa ''Kayıt başarısız! Bu mail adresiyle daha önce kayıt olunmuş!'' uyarısını ekrana yazdırdık.
Eğer tüm bu hata koşullarından hiçbirisi sağlanmıyor yani formumuzda hiçbir hata yoksa:
else {
try {
$passwordsecurity = md5($password1);
$userregister = "INSERT INTO users(username, password, mail, status, created_time) VALUES('$username', '$passwordsecurity', '$mail', '1', NOW())";
$conn->exec($userregister);
header("location: register.php?type=success");
} catch (PDOException $e) {
header("location: register.php?type=error");
echo $e->getMessage();
}
}
diyerek, üye olacak kişinin girdiği username, password, mail bilgilerini veritabanına kaydettik. Burada kullandığımız:
- $passwordsecurity = md5($password1);
işlem, kullanıcının girmiş olduğu şifreyi, veritabanına md5 olarak kaydetmesidir. Böylece şifre güvenli halde saklı tutulacaktır.
- status
kısmı için kullandığımız '1' ifadesini kendinize göre değiştirebilirsiniz. Örneğin statusu 1 olanlar üyelerdir 0 olanlar banlı üyelerdir -1 olanlar ise onay bekleyen üyelerdir gibi. Bu kısma diğer bölümlerde daha detaylı bakacağız.
- created_time
bölümü için kullandığımız NOW() , o anki tarihi ve saati kaydetmektedir. Ve yine son aşamada kayıt sırasında veritabanı, bağlantı vb. sorunlarla karşılaşırsak bunları yazdırmak için catch kullandık. Şimdi bir deneme yapalım ve kaydımız sağlanıyor mu test edelim.
Adım 9 - Üye Kayıt Testi
Şimdi ilgili verileri girerek kaydımızı oluşup oluşmadığını veritabanından kontrol edelim.
Formu Dolduruyoruz:
Başarılı Bildirimini Aldık:
Veritabanını Kontrol Ediyoruz:
Evet üye kaydımız başarıyla gerçekleşti! Şimdi bir de hatalı girişlerimizi deneyelim!
Harika! Hata kodlarımız da başarıyla çalışıyor! Bundan sonraki bölümde üyelere özel sayfa oluşturma ve oturum yönetimini işleyeceğiz. Şimdiden herkese başarılar diliyorum. Sevgilerimle :)
Lions