lostyazilim
tr.link

PHP İle Sıfırdan Üyelik Sistemi Kodluyoruz! - Bölüm 1

8 Mesajlar 2.553 Okunma
acebozum
tr.link

Lions Lions WM Aracı Kullanıcı
  • Üyelik 05.05.2017
  • Yaş/Cinsiyet 29 / E
  • Meslek Web-Developer
  • Konum İstanbul Avrupa
  • Ad Soyad M** K**
  • Mesajlar 1025
  • Beğeniler 366 / 534
  • Ticaret 5, (%100)
Hepinize selamlar. Daha evvel, WordPress ile eklenti yapımına dair bir uygulama paylaşmaştık. (Bkz: WordPress Eklenti Nasıl Yazılır? Sıfırdan Eklenti Yazıyoruz! ) Bu uygulamada ise sıfırdan, PHP PDO ve SCSS/SASS kullanarak üyelik sistemi kodlayacağız.

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:














En az 6 karakterli olmalı...




En az 6 karakterli olmalı...













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

rws Abdullahx CCTNKY

kişi bu mesajı beğendi.

elektronikssl
webimgo

Abdullahx Abdullahx MW Aracı Kullanıcı
  • Üyelik 03.04.2019
  • Yaş/Cinsiyet 29 / E
  • Meslek .
  • Konum Trabzon
  • Ad Soyad A** K**
  • Mesajlar 905
  • Beğeniler 393 / 395
  • Ticaret 3, (%100)
Elinize sağlık, baştan sona kadar dikkatle okudum :)
Amacım bilmişlik yapmak veya herhangi olumsuz bir görüş bildirmek değil de şey dikkatimi çekti, affınıza sığınarak bir şey söylemek istiyorum.
strlen() fonksiyonu karakter sayısını alıyor ama Türkçe karakterleri hesaplarken yanlış hesap yapıyor. Mesela "abcdeş" kelimesi 6 harfli fakat strlen fonksiyonu bunu 7 harfli olarak görüyor. Hani ufacık bir detay ama madem kodlara böyle bir sorgu eklediğinize göre siz de detaylara önem veriyorsunuzdur diye düşündüm :) mb_strlen() fonksiyonu Türkçe karakterleri de düzgün şekilde sayıyor. Yani dikkate alırsanız tabii.
Lions

kişi bu mesajı beğendi.


Lions Lions WM Aracı Kullanıcı
  • Üyelik 05.05.2017
  • Yaş/Cinsiyet 29 / E
  • Meslek Web-Developer
  • Konum İstanbul Avrupa
  • Ad Soyad M** K**
  • Mesajlar 1025
  • Beğeniler 366 / 534
  • Ticaret 5, (%100)
Abdullahx , Kıymetli yorumunuz için teşekkür ederim. İngilizce temelli yazdığım için söylediğiniz ayrıntıyı kaçırmışım. Teşekkür ederim, düzeltmesini yaptım :)
Abdullahx

kişi bu mesajı beğendi.

Abdullahx Abdullahx MW Aracı Kullanıcı
  • Üyelik 03.04.2019
  • Yaş/Cinsiyet 29 / E
  • Meslek .
  • Konum Trabzon
  • Ad Soyad A** K**
  • Mesajlar 905
  • Beğeniler 393 / 395
  • Ticaret 3, (%100)
Ben teşekkür ederim :) Lions
Lions

kişi bu mesajı beğendi.


wmaraci
wmaraci

Sinan Sinan Grana Kullanıcı
  • Üyelik 18.07.2011
  • Yaş/Cinsiyet 31 / E
  • Meslek Yazılım Geliştirme Uzmanı
  • Konum İstanbul Avrupa
  • Ad Soyad S** Y**
  • Mesajlar 3509
  • Beğeniler 1321 / 1320
  • Ticaret 97, (%100)
Dikkatimi çekti de, hem "bootstrap.js" hem "bootstrap.min.js" hem de "bootstrap.bundle.js" dosyalarını aynı anda eklemişsiniz. Sadece "bootstrap.bundle.js" ekleseniz yeterli olacaktır. Aynı şey CSS tanımlamalarındaki "bootstrap.css" ve "bootstrap.min.css" içinde geçerli. Sadece "bootstrap.min.css" yeterli.
soulmy Lions

kişi bu mesajı beğendi.

Lions Lions WM Aracı Kullanıcı
  • Üyelik 05.05.2017
  • Yaş/Cinsiyet 29 / E
  • Meslek Web-Developer
  • Konum İstanbul Avrupa
  • Ad Soyad M** K**
  • Mesajlar 1025
  • Beğeniler 366 / 534
  • Ticaret 5, (%100)
Sinan , Teşekkür ederim, haklısınız, aslında diğer js'lere de şu etapta ihtiyaç yok, ilerleyen süreçte paneldir, üye etkileşimleridir, takip sistemi vs. yapacağım için şimdiden eklemiş olayım dedim :)
 

 

Yusufcoruh Yusufcoruh WM Aracı Kullanıcı
  • Üyelik 30.08.2016
  • Yaş/Cinsiyet 48 / E
  • Meslek Muhasebe
  • Konum İstanbul Anadolu
  • Ad Soyad Y** C**
  • Mesajlar 136
  • Beğeniler 17 / 16
  • Ticaret 0, (%0)

$bosalan = '';
$sifreyetersiz = '';

$sifreuyumsuz = '';

$uyeadidolu = '';

$mailvar = '';


Html formunun içinde bu hatamesajlarını içeren değişkenlerin olması gerekmiyormu ?
benmi göremiyorum ?

bir dğer sorum ise

if (empty($username || $password1 || $password2 | $mail)) {
$bosalan = '';


bu yukardaki kodda || ifadesi ile $bosalan hatası her bir alan için değilde tüm alanlar için gecerli oluyor , yani genel bir Lütfen boş alanları doldurun uyarısı veriyor .. ayrıca kullanıcı adı veya şifre boş ise dedikten sonra bir tanesi dolu oldugunda diğeri için bu hata çalışmamış oluyor . veya ben yapamamış oluyorumda denebilir tabi :)
 

 

UNKEF UNKEF WM Aracı Kullanıcı
  • Üyelik 06.03.2015
  • Yaş/Cinsiyet 35 / E
  • Meslek ARGE
  • Konum Balıkesir
  • Ad Soyad F** Ç**
  • Mesajlar 2422
  • Beğeniler 995 / 744
  • Ticaret 17, (%100)
Bölümlerin altına bir de video anlatımı olsaymış mükemmel olurmuş. Belki eklersiniz diye konu linkini aldım.
 

 

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al