prepare() ile hazırlanmış sorgu
prepare() ile hazırlanmış sorgu oluşturmayı ve neden daha güvenli olduğunu öğrenirsin.
prepare() ne işe yarar?
prepare() metodu bir SQL şablonu hazırlar ve veriyi SQL komutundan ayırır. Sabit kısım metinde kalır; değişen değerler yer tutuculara konur — ya ? ya da :isim biçiminde.
PDO şablonu derler ama çalıştırmaz; dönen PDOStatement nesnesini sen yönetirsin. Değerleri sonra execute() ile verirsin.
Bu yaklaşım güvenliği artırır: SQL injection saldırıları engellenir ve aynı sorgu tekrar tekrar hızlıca çalıştırılabilir.
İki adımlı akış
Hazırlanmış sorgu iki adımda çalışır. Önce prepare() şablonu alır ve bir PDOStatement nesnesi döndürür. Sonra execute() yer tutuculara değerleri bağlar ve sorguyu çalıştırır.
Değerler bir dizi olarak verilir; örneğin execute([2]). Aynı $stmt nesnesini tekrar tekrar execute() ederek farklı değerlerle çalıştırabilirsin; bu, performans kazancı sağlar.
Sonuçlar fetch() veya fetchAll() ile alınır.
Uygulama prepare ile tek satır bul
prepare() ile 'SELECT name FROM users WHERE id = ?' şablonunu hazırla. execute([2]) ile çalıştır, fetch(PDO::FETCH_ASSOC) ile satırı al ve name alanını yazdır.
Örnek çözümü göster
:FETCH_ASSOC) ile al. echo $row['name'] . "\n" ile yazdır.
Örnek çözüm:
<?php
// prepare ile ? yer tutucu hazırla ve execute ile çalıştır
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
$pdo->exec("INSERT INTO users (name) VALUES ('Ayşe')");
$pdo->exec("INSERT INTO users (name) VALUES ('Mehmet')");
$stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?");
$stmt->execute([2]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo $row['name'] . "\n";
Kendini test et
-
prepare() hangi avantajı sağlar?
- SQL şablonunu veriden ayırır, enjeksiyonu önler
- Sorguyu her zaman daha hızlı çalıştırır
- Çalıştığında asla hata fırlatmaz
- Tablo oluşturmaya gerek bırakmaz
Cevabı göster
SQL şablonunu veriden ayırır, enjeksiyonu önler — Doğru! prepare() SQL ile veriyi ayırarak enjeksiyonu engeller.
-
prepare() çağrısını tamamla
$stmt = $pdo->____("SELECT id FROM users WHERE name = ?");Cevabı göster
$stmt = $pdo->prepare("SELECT id FROM users WHERE name = ?"); -
Yöntem ve görevini eşleştir
- prepare()
- Sorgu şablonunu hazırlar
- execute()
- Hazırlanan sorguyu çalıştırır
- fetch()
- Tek satır sonucunu alır