PHP 8 · PDO · MIT Lisans

Modüler Rapor Üretim Sistemi

SQL Injection koruması, XSS filtresi ve temiz katmanlı mimariyle geliştirilmiş PHP 8 rapor modülü. Tek satırla rapor oluşturun, CSV indirin, stored procedure çalıştırın.

GitHub'da İncele Kuruluma Geç
index.php
// Tek satır include yeterli
require_once __DIR__ . '/cls/Raporlar.php';

$raporlar = new Raporlar($pdo);

// Filtresiz rapor
$raporlar->RaporOlustur('satis_raporu');

// Filtreli rapor — SQL Injection yok
$raporlar->RaporOlustur(
    raporad:  'satis_raporu',
    where:    'tarih >= :bas AND tarih <= :bit',
    kosullar: [':bas' => '2025-01-01', ':bit' => '2025-12-31']
);

// CSV indir
$raporlar->exportExcel('satis_raporu');
exit;
4
Sınıf Dosyası
PHP 8
Minimum Versiyon
0
Bağımlılık
PDO
Veritabanı Katmanı
MIT
Lisans

İhtiyacınız olan her şey
tek modülde

Karmaşık kurulum yok, framework bağımlılığı yok. Sadece include edin ve kullanmaya başlayın.

Tek Satır Entegrasyon

Sadece Raporlar.php include edin. Diğer dosyalar otomatik yüklenir.

🛡️

SQL Injection Koruması

Tüm sorgular PDO prepared statement ile çalışır. Kullanıcı girdisi asla doğrudan SQL'e girmez.

📊

Esnek Filtreleme

Named placeholder sistemiyle dinamik WHERE koşulları güvenle oluşturulur ve birleştirilebilir.

📥

CSV Export

UTF-8 BOM ile Türkçe karakter destekli gerçek CSV. Tarayıcı doğrudan indirmeye başlar.

⚙️

Stored Procedure Desteği

Birden fazla result set döndüren stored procedure'ler nextRowset() ile desteklenir.

🧩

Katmanlı Mimari

Repository, Renderer ve Exporter ayrı sınıflarda. Her biri bağımsız kullanılabilir ve test edilebilir.

Tek Sorumluluk
İlkesiyle tasarlandı

Her sınıf tek bir işi yapar. Veri çekme, HTML üretme ve export birbirinden tamamen ayrılmış.

📦 Raporlar.php ← Facade
┣━
💾 RaporRepository
Veritabanı katmanı · PDO · Prepared Stmt
┣━
🖥️ RaporRenderer
HTML üretimi · XSS koruması · Table2Excel
┗━
📤 RaporExporter
CSV · UTF-8 BOM · Header yönetimi
  • 1

    RaporRepository

    Veritabanı sorgularını yönetir. Tablo, view ve stored procedure'den veri çeker. HTML üretmez.

  • 2

    RaporRenderer

    Repository'den aldığı veriyi HTML tabloya dönüştürür. Veritabanına hiç dokunmaz.

  • 3

    RaporExporter

    Veriyi gerçek CSV formatında dışa aktarır. HTML tablo değil, doğrudan fputcsv kullanır.

  • 4

    Raporlar (Facade)

    Tüm alt sınıfları bir araya getirir. Dışarıya tek giriş noktası sunar, geriye dönük uyumluluk sağlar.

Her senaryo için
kod örneği

Basit listeden stored procedure'e, CSV export'tan JOIN sorgusuna kadar tüm kullanım biçimleri.

// raporlar tablosunda raporad='satis_raporu' kaydı olmalı
// kaynak alanı: tablo adı veya view adı

$raporlar = new Raporlar($pdo);
$raporlar->RaporOlustur('satis_raporu');
// WHERE cümlesi şablon, değerler ayrı geçirilir → SQL Injection yok

$where    = 'tarih >= :bas AND tarih <= :bit';
$kosullar = [':bas' => '2025-01-01', ':bit' => '2025-12-31'];

// Ek koşul dinamik olarak eklenebilir
if ($musteriId > 0) {
    $where            .= ' AND musteri_id = :mid';
    $kosullar[':mid']  = $musteriId;
}

$raporlar->RaporOlustur(
    raporad:  'satis_raporu',
    where:    $where,
    kosullar: $kosullar
);
// raporlar tablosundaki kaynak alanı: stored procedure adı
// Parametreler sıralı → CALL sp_aylik_ozet('2025', '03')

$raporlar->RaporOlusturSSP(
    raporad:      'aylik_ozet',
    parametreler: ['2025', '03'],
    kolonAdlari:  ['ay', 'toplam_satis', 'adet']
);

// Birden fazla result set döndüren SP → nextRowset() ile
$stmt = $pdo->prepare("CALL sp_aylik_ozet(:yil, :ay)");
$stmt->execute([':yil' => '2025', ':ay' => '03']);
$ozet        = $stmt->fetch(PDO::FETCH_OBJ);
$stmt->nextRowset();
$urunDagilim = $stmt->fetchAll(PDO::FETCH_OBJ);
$stmt->closeCursor();
// export çağrısı HTML'den ÖNCE yapılmalı — header() gönderir

// Filtresiz
$raporlar->exportExcel('satis_raporu');
exit;

// WHERE filtreli
$raporlar->exportExcel(
    raporad:  'satis_raporu',
    where:    'musteri_id = :mid',
    kosullar: [':mid' => $musteriId]
);
exit;

// Stored procedure CSV
$exporter->exportCSVSSP(
    raporad:      'aylik_ozet',
    parametreler: ['2025', '06'],
    kolonAdlari:  ['ay', 'toplam', 'adet']
);
exit;
// JOIN veya karmaşık sorgular için — rapor tanımı gerekmez
// $sorgu içine kullanıcı girdisi YAZILMAZ, $kosullar ile geçirilir

$raporlar->RaporOlusturWithQuery(
    sorgu: 'SELECT
                k.ad, k.soyad, k.email,
                COUNT(s.id)  AS satis_adeti,
                SUM(s.tutar) AS toplam_tutar
            FROM kullanicilar k
            LEFT JOIN satislar s ON s.kullanici_id = k.id
            WHERE k.durum = :durum
            GROUP BY k.id
            ORDER BY toplam_tutar DESC',
    kolonAdlari: ['ad', 'soyad', 'email', 'satis_adeti', 'toplam_tutar'],
    kosullar:    [':durum' => $durum],
    raporad:     'kullanici_ozeti'
);
// Alt sınıfları doğrudan kullanmak: HTML'i değişkene al, şablona göm

$repo     = new RaporRepository($pdo);
$renderer = new RaporRenderer($repo);
$exporter = new RaporExporter($repo);

// Sadece veriyi al (nesne dizisi)
$satirlar = $repo->getSatirlar(
    raporad:  'satis_raporu',
    where:    'durum = :d',
    kosullar: [':d' => 'tamamlandi']
);

// HTML'i değişkene al
$html = $renderer->renderRapor('satis_raporu');
echo '<div class="rapor">' . $html . '</div>';

Dakikalar içinde
çalışır hale gelin

Framework yok, Composer yok. Dosyaları indirin, SQL'i yükleyin, çalıştırın.

01

Dosyaları İndirin

GitHub repo'sundan tüm dosyaları aynı klasöre koyun. Herhangi bir bağımlılık kurmanıza gerek yok.

C:\xampp\htdocs\projem\cls\
├── Raporlar.php
├── RaporRepository.php
├── RaporRenderer.php
└── RaporExporter.php
02

SQL'i Yükleyin

kurulum.sql dosyasını phpMyAdmin'de import edin. Tablolar, view ve örnek veriler otomatik oluşur.

✓ musteriler — 10 kayıt
✓ urunler — 10 kayıt
✓ satislar — 35 kayıt
✓ v_satis_raporu — view
✓ raporlar — tanım tablosu
03

PDO Bağlantısını Yapılandırın

PDO nesnesini bir kez oluşturun ve Raporlar sınıfına iletin.

$pdo = new PDO(
  'mysql:host=localhost;dbname=voidb',
  'root', '',
  [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
04

İlk Raporunuzu Çalıştırın

Tarayıcıda açın ve raporu görün. Örnek dosyalar hazır, hemen çalışır.

require_once __DIR__ . '/cls/Raporlar.php';
$raporlar = new Raporlar($pdo);
$raporlar->RaporOlustur('satis_raporu');

Orijinalden ne
değişti?

Eski kod birçok kritik güvenlik açığı barındırıyordu. Her biri sistematik olarak giderildi.

🔴
SQL Injection
Her sorguda açık vardı
Eski
query("SELECT * FROM ... WHERE email='$email'")
Yeni
prepare("... WHERE email = :email") → execute([':email' => $email])
🔴
XSS Koruması
Ham veri HTML'e yazılıyordu
Eski
echo "<td>" . $veri->deger . "</td>"
Yeni
echo "<td>" . htmlspecialchars($veri->deger, ENT_QUOTES) . "</td>"
🔴
Hata Gizleme
@ operatörü ile hatalar bastırılıyordu
Eski
while(@$sonuc = $dba->fetch_object($sql)) { ... }
Yeni
try { ... } catch (RuntimeException $e) { error_log($e->getMessage()); }
🔴
Sahte Excel Export
HTML tablosu .xls olarak gönderiliyordu
Eski
header("Content-Type: application/vnd.ms-excel"); echo $htmlTablo;
Yeni
header("Content-Type: text/csv"); fputcsv($output, $satir, ';'); // Gerçek CSV