PHP
Özet - Hazırlanmış sorgular
prepare, execute, bindParam ve named placeholder'larla güvenli arama uygulaması yazarsın.
Özet - Hazırlanmış sorgular
Bu grupta hazırlanmış sorguların beş temel taşını öğrendin: prepare() şablonu hazırlar, execute() değerlerle çalıştırır, bindParam() referans ile bağlar, bindValue() değeri anında kopyalar ve :isim yer tutucu sıraya değil isme göre eşleşir.
Hazırlanmış sorgu SQL ile veriyi ayırarak SQL injection saldırılarını engeller. INSERT sonrası lastInsertId() yeni kimliği, rowCount() etkilenen satır sayısını verir.
Şimdi bu parçaları birleştirip güvenli bir arama uygulaması yazacağız.
Güvenli arama uygulaması
Şimdi öğrendiklerini birleştirelim: searchBooks() fonksiyonu, kitapları yazar ve yıl ile filtreleyecek. Fonksiyon prepare() ile :author ve :minYear adlandırılmış yer tutucuları içeren bir şablon hazırlayacak, bindParam() ile değişkenleri referans ile bağlayacak, execute() çalıştıracak ve fetchAll() ile sonuçları döndürecek.
Bu yapı SQL injection'ı otomatik engeller; yazar adı ne olursa olsun yalnızca bir metin değeri olarak değerlendirilir.
Aynı fonksiyon farklı yazar ve yıl değerleriyle tekrar tekrar çağrılabilir.
Uygulama Özet - Güvenli kitap arama
searchBooks(PDO $pdo, string $author, int $minYear): array fonksiyonunu yaz. prepare() ile 'SELECT title FROM books WHERE author = :author AND year >= :minYear' şablonu hazırla. bindParam(':author', $author, PDO::PARAM_STR) ve bindParam(':minYear', $minYear, PDO::PARAM_INT) ile bağla. execute() çağır, fetchAll(PDO::FETCH_ASSOC) ile döndür. searchBooks($pdo, 'Atay', 1973) çağır ve her satırın title alanını yazdır.
Örnek çözümü göster
array yaz. İçinde $stmt = $pdo->prepare("SELECT title FROM books WHERE author = :author AND year >= :minYear") yaz. $stmt->bindParam(':author', $author, PDO::PARAM_STR) ve $stmt->bindParam(':minYear', $minYear, PDO::PARAM_INT) çağır. $stmt->execute() çalıştır. return $stmt->fetchAll(PDO::FETCH_ASSOC) döndür. Dışarıda $results = searchBooks($pdo, 'Atay', 1973) çağır, foreach ($results as $row) { echo $row['title'] . "\n"; } yazdır.
Örnek çözüm:
<?php
// Güvenli arama: prepare + execute + named placeholder + bindParam birleşimi
$pdo = new PDO('sqlite::memory:');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("CREATE TABLE books (id INTEGER PRIMARY KEY, title TEXT, author TEXT, year INTEGER)");
$pdo->exec("INSERT INTO books (title, author, year) VALUES ('Sefiller', 'Hugo', 1862)");
$pdo->exec("INSERT INTO books (title, author, year) VALUES ('Saatleri Ayarlama', 'Atay', 1973)");
$pdo->exec("INSERT INTO books (title, author, year) VALUES ('Tutunamayanlar', 'Atay', 1972)");
function searchBooks(PDO $pdo, string $author, int $minYear): array {
$stmt = $pdo->prepare("SELECT title FROM books WHERE author = :author AND year >= :minYear");
$stmt->bindParam(':author', $author, PDO::PARAM_STR);
$stmt->bindParam(':minYear', $minYear, PDO::PARAM_INT);
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
$results = searchBooks($pdo, 'Atay', 1973);
foreach ($results as $row) {
echo $row['title'] . "\n";
}
Kendini test et
-
Hazırlanmış sorgularda doğru akış hangisidir?
- execute → prepare → fetch
- prepare → bindParam → execute → fetch
- fetch → prepare → execute
- prepare → fetch → execute
Cevabı göster
prepare → bindParam → execute → fetch — Doğru! Önce prepare, sonra bindParam, sonra execute, en son fetch.
-
Arama fonksiyonunda bindParam çağrısını tamamla
$stmt->____(':author', $author, PDO::PARAM_STR);
Cevabı göster
$stmt->bindParam(':author', $author, PDO::PARAM_STR);
-
Beş temel taşı eşleştir
- prepare()
- Şablonu hazırlar
- execute()
- Sorguyu çalıştırır
- bindParam()
- Referans ile bağlar
- bindValue()
- Değeri anında bağlar
- :name
- Adlandırılmış yer tutucu
Sıradaki ders: INSERT ile kayıt ekleme