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.
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.
Sınıfı oluşturduktan sonra projenizin herhangi bir yerinde veritabanı işlemlerini şu şekilde son derece güvenli bir şekilde yapabilirsiniz:
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.
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 = 'localhost';
private $user = 'db_kullanici';
private $pass = 'guclu_sifre';
private $name = 'forum_veritabani';
private function __construct() {
try {
$dsn = "mysql:host={$this->host};dbname={$this->name};charset=utf8mb4";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$this->conn = new PDO($dsn, $this->user, $this->pass, $options);
} catch (PDOException $e) {
// Gerçek şifreleri gizlemek için hatayı loglayın, ekrana basmayın
error_log($e->getMessage());
die("Veritabanı bağlantı hatası oluştu.");
}
}
public static function getInstance() {
if (!self::$instance) {
self::$instance = new Database();
}
return self::$instance;
}
public function getConnection() {
return $this->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
| Kural | Açıklama |
|---|---|
| Charset utf8mb4 | Emojiler ve özel karakterlerin hatasız kaydedilmesi için zorunludur. |
| Error Mode | Hataları istisna (Exception) olarak fırlatmak, sessiz hataların önüne geçer. |
| Prepared Statements | Asla 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.