EduSphere
PHP & MySQL tabanlı, güvenli, modern ve rol tabanlı bir Gelişmiş Öğrenci Bilgi Yönetim Sistemi
Proje ve Sistem Tanıtımı
-
Temel Amaç ve VizyonEğitim süreçlerini dijitalleştirip, manuel kayıt hatalarını sıfırlamak ve akademik notları anlık olarak raporlayıp grafiklere dökmek.
-
Rol Tabanlı Güvenli MimariYönetici (Admin): Tam CRUD, yetki atama, not girişi ve grafiksel izleme.
Öğrenci (Student): Sadece kendi profilini görme, not/karne sorgulama ve şifre değiştirme. -
Modüler Dosya Yapısı15 farklı PHP sayfası, ortak tasarım şablonları (includes/header-sidebar-footer) ve izole edilmiş yetkilendirme katmanları.
Sistem Yapısı (Architecture)
Tam Yetki (CRUD)
Kişisel Karne (GNO)
Geliştirme Ortamı ve Teknolojiler
-
PHP 8.2 & PDO Veri KatmanıSunucu taraflı modern PHP syntax özellikleri ve SQL Injection zafiyetlerini önleyen güvenli nesne yönelimli PDO bağlantısı.
-
MySQL / MariaDBİlişkisel veritabanı yapısı. Tablolar arasında CASCADE entegrasyonu ve veri çakışmasını önleyen kısıtlamalar (Constraints).
-
Vanilla CSS & JS DOMHiçbir ağır kütüphaneye bağlı kalınmadan oluşturulan responsive cam (glassmorphic) teması. Javascript Live Search ve anlık dosya önizleme yetenekleri.
PHP 8.2
Backend Mantığı
MySQL
İlişkisel DB
PDO
Sorgu Güvenliği
CSS3 & JS
Modern Arayüz
Chart.js
Dinamik Grafik
XAMPP
Lokal Apache
İlişkisel Veritabanı Tasarımı
-
4 Ana Tablo ve Görevleri`users`: Giriş yetkileri ve şifreli parolalar (admin/student).
`students`: Öğrencinin adı, soyadı, nosu, bölümü ve profil resmi.
`courses`: AKTS kredi ve öğretim görevlisi ders kataloğu.
`enrollments`: Not kayıtları (vize, final, ortalama, geçti/kaldı). -
ON DELETE CASCADE & BütünlükBir kullanıcının hesabı silindiğinde veya bir öğrenci kaydı silindiğinde, ona bağlı tüm kayıtlar ve notlar otomatik olarak silinir. Yetim/ölü veri birikimi engellenir.
phpMyAdmin Canlı Gösterimi
Veritabanı Yapısı ve İlişkiler
Tarayıcıdan http://localhost/phpmyadmin/ adresine gidilerek, ogrenci_db veritabanı yapısı incelenecektir.
Sütun tipleri, AUTO_INCREMENT alanları ve veri setleri.
Relation View altındaki Foreign Key bağlantılarının gösterilmesi.
Mükerrer kaydı önleyen UNIQUE student_course kuralı.
Giriş Sistemi & Oturum Yönetimi
-
password_hash() (BCRYPT) GüvenliğiKullanıcı şifreleri veritabanına asla düz metin yazılmaz. Tek yönlü BCRYPT algoritmasıyla sunucu bazlı dinamik tuzlama (salt) yapılarak hashlenir.
-
Rol Tabanlı Yetkilendirme (Oturum Denetimi)Sayfa başlarında, oturum değişkenleri kontrol edilir (`$_SESSION['role']`). Öğrencilerin doğrudan URL manipülasyonu ile idari sayfalara erişmesi kesinlikle engellenir.
-
Logout Fiziksel İmha Süreci`logout.php` çalıştırıldığında oturum çerezleri sunucudan fiziksel olarak yok edilir ve kullanıcı lobi sayfasına yönlendirilir.
Rol Tabanlı Giriş ve Çıkış
Yönetici Portalı: Kullanıcı adı: admin / Şifre: admin123 ile tam dashboard gösterimi.
Öğrenci Portalı: Öğrenci No: 220101001 / Şifre: ogr12345 ile sadece karne gösterimi.
Yetki İhlal Testi: Giriş yapmadan veya öğrenci hesabı ile idari bir linke doğrudan URL yazarak gitmeye çalışıp engellemeyi gösterme.
CRUD İşlemleri - Öğrenci Yönetimi
-
Yaratma (CREATE) & Hesap SenkronizasyonuYeni öğrenci eklendiğinde aynı okul numarasıyla
userstablosuna otomatik olarak varsayılan şifreli (ogr12345) bir portal hesabı da açılır. -
Listeleme (READ) & Canlı Javascript AramaPerformans için 5'erli limitlerle sayfalama (Pagination) yapılır. Ayrıca sayfa yenilenmeden dinamik JS anlık arama (DOM manipülasyonu) çalışır.
-
Silme (DELETE) & Disk TemizliğiÖğrenci kaydı silindiğinde sunucuda yer kaplamaması için
unlink()fonksiyonu ile profil resmi de diskten fiziksel olarak kaldırılır.
Canlı Otomasyon Akışı
Yeni resimli öğrenci ekleme formu.
FileReader API ile yüklemeden önce anlık fotoğraf önizleme.
Canlı JS arama çubuğunun ve sayfalama tuşlarının testi.
JS confirm uyarısı eşliğinde silme testi ve disk resmi doğrulaması.
CRUD İşlemleri - Ders & Kayıt
-
Ders Kataloğu YönetimiAKTS kredi, kod ve akademisyen bazlı ders ekleme ve kod çakışma (UNIQUE code) kontrolleri.
-
Not Girişi & Başarı HesabıÖğrenciye ders tanımlama ve vize/final notu verme. Ağırlıklı ders ortalaması (Vize %40, Final %60) ve durum (Geçti/Kaldı) sistem tarafından otomatik hesaplanır.
-
Dinamik Dashboard GrafikleriYönetici panelinde veritabanından çekilen ders ortalamaları
json_encode()ile Chart.js grafik motoruna beslenerek dinamik sütun grafikler oluşturulur.
Akademik Notlandırma Testi
Ders ekleme / düzenleme testleri.
Ders Kayıt modülünden notların girilmesi.
Otomatik hesaplanan Geçti/Kaldı etiketlerinin renkli gösterimi.
Chart.js grafiklerinin ve son aktiviteler panelinin güncellenmesinin izlenmesi.
Güvenli Bağlantı (PDO)
-
Neden PDO?Veritabanı bağımsızlığı (ileride PostgreSQL/Oracle geçiş kolaylığı) ve nesne tabanlı gelişmiş hata yakalama (Exceptions).
-
Karakter Seti GüvencesiBağlantı dizesindeki
charset=utf8mb4tanımı sayesinde Türkçe karakter problemleri kökten çözülmüştür. -
try-catch MimarisiOlası sunucu çökmeleri yakalanarak hassas sistem bilgilerinin sızması önlenir, kullanıcıya temiz hata mesajı gösterilir.
try { // Bağlantı dizesi (utf8mb4 Türkçe desteği) $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass); // Hata yönetim modunu Exception fırlatacak şekilde ayarlama $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Varsayılan veri çekme modunu ilişkisel dizi yapma $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch (PDOException $e) { // Sunucu bilgilerinin dışarı sızmasını engelleme die('Veritabanı hatası: ' . htmlspecialchars($e->getMessage())); }
Şifre Saklama ve Giriş Doğrulama
-
password_verify() MimarisiZaman aşımı saldırılarına (timing attacks) karşı korumalı ve hash bütünlüğünü doğrulayan yerleşik PHP algoritması.
-
Prepared StatementsDeğişkenler sorguya doğrudan eklenmez.
prepare()veexecute()ile dışarıdan gelen girdiler sterilize edilir, SQL Injection imkansız hale getirilir.
// Parametreli sorgu ile SQL Injection koruması $stmt = $pdo->prepare('SELECT * FROM users WHERE username = ? AND role = ?'); $stmt->execute([$username, $role]); $user = $stmt->fetch(); // BCRYPT hash doğrulama if ($user && password_verify($password, $user['password'])) { // Oturum değişkenlerini belirleme $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; $_SESSION['role'] = $user['role']; header('Location: dashboard.php'); exit; }
Atomik İşlemler (Transactions)
-
Neden Transaction?Yeni öğrenci eklenirken hem
usershemstudentstablolarına eşzamanlı veri yazılır. İkisinden biri başarısız olursa veritabanı tutarsızlığı (yetim öğrenci hesabı) yaşanabilir. -
İptal Etme (rollBack) GücüTry-catch bloğu içerisinde olası bir hatada
rollBack()çağrılarak veritabanı eski durumuna çekilir, başarıda isecommit()ile kalıcı kılınır.
// Eş zamanlı eklemede veritabanı bütünlüğünü koruma $pdo->beginTransaction(); try { // 1. Portal giriş hesabı aç $default_pass = password_hash('ogr12345', PASSWORD_DEFAULT); $u_stmt = $pdo->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, 'student')"); $u_stmt->execute([$no, $default_pass]); $new_user_id = $pdo->lastInsertId(); // Yeni ID'yi al // 2. Eşleşen öğrenci bilgisini ekle $s_stmt = $pdo->prepare("INSERT INTO students (ad, soyad, no, bolum, user_id) VALUES (?, ?, ?, ?, ?)"); $s_stmt->execute([$ad, $soyad, $no, $bolum, $new_user_id]); $pdo->commit(); // Her iki işlem de başarılıysa kaydet } catch (Exception $e) { $pdo->rollBack(); // En ufak hatada veritabanını geri al $error = "İşlem iptal edildi: " . $e->getMessage(); }
Karşılaşılan Sorunlar ve Çözümler
⚠️ Sorun 1: Öğrenci No & Portal Senkronizasyonu
Öğrenci numarası güncellendiğinde, users tablosundaki kullanıcı adının eski kalması ve öğrencilerin yeni numarayla giriş yapamaması durumu yaşandı.
Çözüm: Veritabanı Transaction yapısı entegre edilerek update işlemleri atomik hale getirildi. Bir tabloda numara güncellendiğinde diğeri de eşzamanlı güncellenmektedir.
🛡️ Sorun 2: Dosya Yüklemelerinde Web-Shell Riski
Kullanıcıların profil fotoğrafı yükleme formunu manipüle edip sunucuya kötü niyetli .php uzantılı scriptler yükleme ve çalıştırma tehlikesi mevcuttu.
Çözüm: PHP tarafında pathinfo() uzantı filtreleri, sıkı MIME tipi kontrolleri (yalnızca image/jpeg vb.) ve 2MB boyut limiti getirilerek dosya yükleme sistemi tamamen izole edildi.
Gelişmiş Kullanıcı Deneyimi (main.js)
-
Sayfa Yenilemesiz Canlı Arama (Live Search)JavaScript DOM manipülasyonu ile arama kutusuna girilen karakterler tablo hücreleri ile anlık kıyaslanır. Eşleşmeyen satırlar sıfır gecikmeyle gizlenir.
-
İstemci Tarafı Anlık Resim ÖnizlemeÖğrenci profil resmi formda seçilir seçilmez, sunucuya yüklenmeden önce tarayıcıda FileReader API ile render edilerek şık bir önizleme sunulur.
-
Form Validasyonu & Silme OnayıVize ve final notlarının 0-100 aralığında girilmesi istemci tarafında kısıtlanmıştır. Hatalı veri kayıtlarının ve kazara silmelerin önüne JS ile geçilmiştir.
searchInput.addEventListener('input', function(e) { const term = e.target.value.toLowerCase().trim(); tableRows.forEach(row => { const text = row.textContent.toLowerCase(); if (text.includes(term)) { row.style.display = ''; } else { row.style.display = 'none'; // Eşleşmeyeni gizle } }); });
Web Dünyasında PHP ve Proje Kazanımları
-
PHP'nin Güçlü YanlarıMySQL ile kusursuz uyum, yerleşik session ve dosya yükleme modülleri, çok geniş dokümantasyon kaynağı ve düşük sunucu barındırma maliyetleri.
-
Bu Proje İçin Doğru mu?Kesinlikle evet. Node.js veya Java gibi dillerde günlerce sürecek güvenli oturum yönetimi ve ilişkisel veritabanı CRUD mimarisi PHP ile hızlı ve yüksek kararlılıkla ayağa kaldırılabilmiştir.
📊 Dil Karşılaştırmalı Analiz
| Özellik | Vanilla PHP | Node.js |
|---|---|---|
| DB Entegrasyonu | Çok Hızlı (PDO) | Modül Bağımlı |
| Session Kurulumu | Yerleşik (Session) | Express-session vb. |
| Hosting Uyumu | %100 Uyumlu (Shared) | VPS/Cloud Gerektirir |
Sonuç, Kazanımlar ve Gelecek Planları
-
Elde Edilen Kazanımlarİlişkisel veritabanı kuralları, transaction yönetimi, web shell ve SQL injection önleme metotları, Chart.js grafik entegrasyonu ve modern Vanilla CSS standartları öğrenildi.
-
Farklı Ne Yapardık? (Gelecek Vizyonu)Sayfa yenilenmesini tamamen ortadan kaldıran
Fetch API SPAmimarisi, ders notu girildiğinde öğrenciye otomatik e-posta gönderen SMTP mail modülü.
Gelecek Yol Haritası
Sınav Bildirim Sistemi
Not girildiğinde anlık SMTP mail bildirimi
Veri Dışa Aktarım
Tek tıkla PDF ve Excel karne raporlama