⌨️ Sunum Kontrol Kısayolları

→ / Space
Sonraki Slayt
← / Backspace
Önceki Slayt
N
Konuşmacı Notlarını Göster / Gizle
F
Tam Ekran Yap / Çık
H
Yardım Menüsünü Kapat
İnternet Programcılığı Final Projesi 1 / 15
FİNAL JÜRİ SUNUMU

EduSphere

PHP & MySQL tabanlı, güvenli, modern ve rol tabanlı bir Gelişmiş Öğrenci Bilgi Yönetim Sistemi

Grup Projesi İnternet Programcılığı
Sunum Süresi 8–12 Dakika
BÖLÜM 1

Proje ve Sistem Tanıtımı

  • Temel Amaç ve Vizyon
    Eğ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 Mimari
    Yö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)

index.php (Karşılama)
login.php (Rol Belirleme)
Yönetici Paneli
Tam Yetki (CRUD)
Öğrenci Portalı
Kişisel Karne (GNO)
BÖLÜM 2

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 DOM
    Hiç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

BÖLÜM 3

İ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ük
    Bir 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.
users Hesaplar
🔑 idINT (PK)
usernameVARCHAR (UNIQUE)
passwordVARCHAR (HASH)
roleENUM ('admin', 'student')
ON DELETE CASCADE
students Öğrenciler
🔑 idINT (PK)
ad, soyad, no, bolumVARCHAR
🔗 user_idINT (FK -> users.id)
CANLI GÖSTERİM PLANI

phpMyAdmin Canlı Gösterimi

CANLI DEMO ADIMLARI

Veritabanı Yapısı ve İlişkiler

Tarayıcıdan http://localhost/phpmyadmin/ adresine gidilerek, ogrenci_db veritabanı yapısı incelenecektir.

1. Tablo Yapıları
Sütun tipleri, AUTO_INCREMENT alanları ve veri setleri.
2. Dış Anahtarlar
Relation View altındaki Foreign Key bağlantılarının gösterilmesi.
3. Kısıtlamalar (Constraints)
Mükerrer kaydı önleyen UNIQUE student_course kuralı.
BÖLÜM 4

Giriş Sistemi & Oturum Yönetimi

  • password_hash() (BCRYPT) Güvenliği
    Kullanı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.
GİRİŞ DEMOSU ADIMLARI

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.

BÖLÜM 5

CRUD İşlemleri - Öğrenci Yönetimi

  • Yaratma (CREATE) & Hesap Senkronizasyonu
    Yeni öğrenci eklendiğinde aynı okul numarasıyla users tablosuna otomatik olarak varsayılan şifreli (ogr12345) bir portal hesabı da açılır.
  • Listeleme (READ) & Canlı Javascript Arama
    Performans 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.
ÖĞRENCİ CRUD DEMOSU

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ı.

BÖLÜM 6

CRUD İşlemleri - Ders & Kayıt

  • Ders Kataloğu Yönetimi
    AKTS 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 Grafikleri
    Yönetici panelinde veritabanından çekilen ders ortalamaları json_encode() ile Chart.js grafik motoruna beslenerek dinamik sütun grafikler oluşturulur.
DERS VE NOT DEMOSU

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.

KOD İNCELEMESİ (1)

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üvencesi
    Bağlantı dizesindeki charset=utf8mb4 tanımı sayesinde Türkçe karakter problemleri kökten çözülmüştür.
  • try-catch Mimarisi
    Olası sunucu çökmeleri yakalanarak hassas sistem bilgilerinin sızması önlenir, kullanıcıya temiz hata mesajı gösterilir.
config/db.php
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()));
}
KOD İNCELEMESİ (2)

Şifre Saklama ve Giriş Doğrulama

  • password_verify() Mimarisi
    Zaman aşımı saldırılarına (timing attacks) karşı korumalı ve hash bütünlüğünü doğrulayan yerleşik PHP algoritması.
  • Prepared Statements
    Değişkenler sorguya doğrudan eklenmez. prepare() ve execute() ile dışarıdan gelen girdiler sterilize edilir, SQL Injection imkansız hale getirilir.
login.php
// 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;
}
KOD İNCELEMESİ (3)

Atomik İşlemler (Transactions)

  • Neden Transaction?
    Yeni öğrenci eklenirken hem users hem students tabloları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 ise commit() ile kalıcı kılınır.
students/add.php
// 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();
}
BÖLÜM 7

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.

BÖLÜM 8

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.
assets/js/main.js (Live Search)
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
        }
    });
});
BÖLÜM 9

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
BÖLÜM 10 / KAPANIŞ

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 SPA mimarisi, 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