Veritabanı Bağlantısı: Güvenli ve Hızlı Connection Sınıfı

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18
Veritabanı bağlantısı, bir web uygulamasının en maliyetli ve en hassas işlemidir. Her kullanıcı için yeni bir bağlantı açmak sunucu kaynaklarını tüketirken, hatalı yapılandırılmış sorgular sitenizi saldırılara açık hale getirir. Bu rehberde, PDO kullanarak nesne yönelimli (OOP) ve güvenli bir bağlantı sınıfı (Database Class) inşa edeceğiz.

1. Neden Bir Sınıf (Class) Kullanmalıyız?​



  • [] Tek Merkezden Yönetim: Veritabanı şifreniz değiştiğinde yüzlerce dosyayı değil, sadece tek bir sınıfı güncellersiniz.
    [] Performans: Gereksiz bağlantı tekrarlarını önler.
    [] Hata Yönetimi: Veritabanı hatalarını kullanıcıya göstermek yerine log dosyalarına kaydederek güvenliği artırırsınız.
    [] Güvenlik: SQL Injection saldırılarına karşı hazırlıklı (prepared) ifadeleri standart hale getirirsiniz.

2. Gelişmiş Database Connection Sınıfı​


Aşağıdaki kodu Database.php olarak kaydedip projelerinize dahil edebilirsiniz. Bu sınıf, bağlantıyı sadece ihtiyaç duyulduğunda açan ve tüm projede aynı bağlantıyı kullanan (Singleton benzeri) bir yapıdadır.

PHP:
<?php

class Database {
private static $instance = null;
private $conn;

private $host = &#39;localhost&#39;;
private $user = &#39;db_kullanici&#39;;
private $pass = &#39;guclu_sifre&#39;;
private $name = &#39;forum_veritabani&#39;;

private function __construct() {
    try {
        $dsn = &quot;mysql:host={$this-&gt;host};dbname={$this-&gt;name};charset=utf8mb4&quot;;
        $options = [
            PDO::ATTR_ERRMODE            =&gt; PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE =&gt; PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES   =&gt; false,
        ];
        
        $this-&gt;conn = new PDO($dsn, $this-&gt;user, $this-&gt;pass, $options);
    } catch (PDOException $e) {
        // Gerçek şifreleri gizlemek için hatayı loglayın, ekrana basmayın
        error_log($e-&gt;getMessage());
        die(&quot;Veritabanı bağlantı hatası oluştu.&quot;);
    }
}

public static function getInstance() {
    if (!self::$instance) {
        self::$instance = new Database();
    }
    return self::$instance;
}

public function getConnection() {
    return $this-&gt;conn;
}

}

3. Sınıfın Kullanımı: Veri Çekme ve Ekleme​


Sınıfı oluşturduktan sonra projenizin herhangi bir yerinde veritabanı işlemlerini şu şekilde son derece güvenli bir şekilde yapabilirsiniz:

Veri Çekme (Select İşlemi)​

PHP:
$db = Database::getInstance()->getConnection();

$uyeId = 5;
$sorgu = $db->prepare("SELECT username, email FROM xf_user WHERE user_id = :id");
$sorgu->execute(['id' => $uyeId]);
$kullanici = $sorgu->fetch();

echo "Hoş geldin, " . htmlspecialchars($kullanici['username']);

Veri Ekleme (Insert İşlemi)​

PHP:
$db = Database::getInstance()->getConnection();

$yeniVeri = [
'baslik' => 'PHP'de Güvenlik',
'icerik' => 'PDO kullanımı çok önemlidir.'
];

$sql = "INSERT INTO konular (baslik, icerik) VALUES (:baslik, :icerik)";
$stmt = $db->prepare($sql);
$stmt->execute($yeniVeri);

echo "Konu başarıyla eklendi. ID: " . $db->lastInsertId();

4. Güvenlik ve Hız İçin Altın Kurallar​


KuralAçıklama
Charset utf8mb4Emojiler ve özel karakterlerin hatasız kaydedilmesi için zorunludur.
Error ModeHataları istisna (Exception) olarak fırlatmak, sessiz hataların önüne geçer.
Prepared StatementsAsla değişkenleri doğrudan SQL içine yazmayın ($id yerine :id kullanın).
Persistent Conn.Çok yüksek trafikli sitelerde bağlantıyı açık tutmak hızı artırabilir.

Sonuç​


Güvenli bir veritabanı bağlantısı, uygulamanızın temelidir. Bu rehberdeki Connection Sınıfı yapısını kullanarak, kodunuzu hem saldırılara karşı korumuş olursunuz hem de profesyonel bir mimari oluşturursunuz. Unutmayın, veritabanı güvenliği "ekstra" bir özellik değil, bir zorunluluktur.
 
Geri
Üst