# PHP PDO Nedir? Güvenli Veritabanı Bağlantısı ve SQL Injection Önleme

https://bihostnet.com/bilgi-bankasi/makale/php-pdo-nedir-guvenli-veritabani-baglantisi-sql-injection

## PHP PDO (PHP Data Objects) Nedir?

PDO, PHP ile veritabanları arasında çalışan hafif, tutarlı ve yüksek güvenlikli bir veritabanı soyutlama katmanıdır. Eski `mysql_*` fonksiyonları PHP 7 ile tamamen kaldırılmıştır; günümüzde standart ve güvenli yöntem PDO'dur.

## Güvenli PDO Bağlantı Şablonu

```
<?php
$host = 'localhost';
$db   = 'kullanici_veritabani';
$user = 'kullanici_dbuser';
$pass = 'GucluSifre123!';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false, // Gerçek prepared statements
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    die("Veritabanı bağlantı hatası oluştu.");
}
?>
```

## SQL Injection Nedir ve Prepared Statements Nasıl Korur?

Kötü niyetli bir kullanıcı form alanına `' OR '1'='1` yazdığında hazırlıksız sorgularda tüm veritabanı sızdırılabilir veya silinebilir.

### Hatalı (Güvensiz) Kullanım:

```
// TEHLİKELİ: SQL Injection'a tamamen açık!
$sql = "SELECT * FROM users WHERE email = '" . $_POST['email'] . "'";
$pdo->query($sql);
```

### Doğru (Güvenli - Prepared Statements) Kullanım:

```
// %100 GÜVENLİ: Parametre ve sorgu ayrıştırılır
$stmt = $pdo->prepare('SELECT id, name, password FROM users WHERE email = :email');
$stmt->execute(['email' => $_POST['email']]);
$user = $stmt->fetch();
```

Prepared statements kullandığınızda veritabanı motoru parametreyi bir SQL komutu olarak değil, salt metin (string) olarak değerlendirir; SQL injection tamamen imkansız hale gelir.
