PHP
Meydan okuma - PDO ve API
PDO, prepared statement ve JSON'la güvenli bir ürün API'si yazarsın.
Proje: Ürün API'si
Bu beş derslik final projesinde ileri seviye tüm konuları birleştiren bir mini uygulama yapacaksın. Her derste bir parça ekleyecek, son derste çalışan bir çekirdek tamamlayacaksın.
Bu derste bir ProductRepository sınıfı tasarlayacaksın: PDO ile ürün tablosunu oluşturur, iki ürün ekler ve all() yöntemiyle hepsini döndürür. Ardından handleGet fonksiyonu, ürünleri json_encode ile yapısal veri olarak yazdırır. PDO::FETCH_ASSOC satırları sütun adlarıyla ilişkisel dizi olarak verir.
Yapısal veri yanıtı
API yanıtlarını yapısal veri olarak göndermek için json_encode kullanırsın. İkinci bağımsız değişken olarak JSON_UNESCAPED_UNICODE verirsen Türkçe karakterler olduğu gibi yazılır; "İ" "\u0130" değil "İ" olarak kalır.
handleGet(PDO $pdo): string imzası, bir PDO bağlantısı alır ve yapısal veri dizesi döndürür. İçinde ProductRepository örneği oluşturup all() çağrısının sonucunu json_encode ile sarmalarsın. sqlite::memory: DSN'i, dosya olmadan her çalıştırmada aynı sonucu üretir.
Uygulama ProductRepository ve handleGet yaz
Bu projenin ilk parçasını yaz. ProductRepository adında bir sınıf tanımla. Özel PDO $pdo özelliği ve PDO alan bir constructor olsun; constructor içinde products tablosunu oluştur (id, name, price sütunları) ve iki ürün ekle: Kale fiyat 5, Defter fiyat 15. all(): array yöntemi ürünleri id, name, price anahtarlarıyla döndürsün (id ve price tamsayı olmalı).
Sonra handleGet(PDO $pdo): string fonksiyonunu yaz: ProductRepository örneği oluşturup all() sonucunu ["products" => ...] şeklinde sarmala ve json_encode ile JSON_UNESCAPED_UNICODE bayrağıyla döndür. Demoda sqlite::memory: ile bağlan ve handleGet çıktısını yazdır.
Örnek çözümü göster
:FETCH_ASSOC) ile satırları al, array_map ile id ve price'ı (int) ile dönüştür. handleGet(PDO $pdo): string içinde json_encode(["products" => $repo->all()], JSON_UNESCAPED_UNICODE) döndür. Son olarak $pdo = new PDO("sqlite::memory:"); echo handleGet($pdo);
Örnek çözüm:
<?php
// Ürün API'si: ProductRepository + handleGet
class ProductRepository {
private PDO $pdo;
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
$this->pdo->exec("CREATE TABLE products (id INTEGER PRIMARY KEY, name TEXT, price INTEGER)");
$stmt = $this->pdo->prepare("INSERT INTO products (name, price) VALUES (?, ?)");
$stmt->execute(["Kale", 5]);
$stmt->execute(["Defter", 15]);
}
public function all(): array {
$rows = $this->pdo->query("SELECT id, name, price FROM products ORDER BY id")->fetchAll(PDO::FETCH_ASSOC);
return array_map(fn($r) => [
"id" => (int)$r["id"],
"name" => $r["name"],
"price" => (int)$r["price"]
], $rows);
}
}
function handleGet(PDO $pdo): string {
$repo = new ProductRepository($pdo);
return json_encode(["products" => $repo->all()], JSON_UNESCAPED_UNICODE);
}
$pdo = new PDO("sqlite::memory:");
echo handleGet($pdo);
Kendini test et
-
PDO::FETCH_ASSOC her satırı nasıl döndürür?
- Sadece sütun indeksleriyle (0, 1, 2...)
- Hem sütun adları hem indekslerle
- Sütun adlarıyla ilişkisel dizi olarak
- Nesne olarak (PDO::FETCH_OBJ ile aynı)
Cevabı göster
Sütun adlarıyla ilişkisel dizi olarak — Doğru. FETCH_ASSOC her satırı sütun adlarıyla erişilen ilişkisel dizi olarak döndürür.
-
json_encode bayrağını tamamla
echo json_encode(["products" => $rows], ____);
Cevabı göster
echo json_encode(["products" => $rows], JSON_UNESCAPED_UNICODE);
-
PDO ve yapısal veri kavramlarını eşleştir
- PDO
- Veritabanı soyutlama katmanı
- prepare
- Hazırlanmış sorgu
- fetchAll
- Tüm satırları döndürür
- json_encode
- Diziyi yapısal veriye çevirir
Sıradaki ders: Meydan okuma - Güvenlik uygulaması