CodeBlanks Logo Icon CodeBlanks

Özet - Hazırlanmış sorgular

PHP kursu · İleri seviye · Ders 14/92

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

  1. 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.

  2. Arama fonksiyonunda bindParam çağrısını tamamla

    $stmt->____(':author', $author, PDO::PARAM_STR);
    Cevabı göster
    $stmt->bindParam(':author', $author, PDO::PARAM_STR);
  3. 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

İleri seviye bölümündeki tüm dersler