Prepared statements (hazırlanmış ifadeler), SQL sorgularını veriden ayırarak güvenli ve verimli veri tabanı işlemleri yapmamızı sağlar. Özellikle kullanıcıdan gelen verilerin sorguya doğrudan eklenmesi, SQL Injection gibi tehlikelere yol açabilir. PDO ile prepared statements kullanarak bu riski ortadan kaldırırız.
1. PREPARED STATEMENTS NEDİR?
Prepared statement, SQL sorgusunu verilerden bağımsız şekilde önceden hazırlar, sonra verileri bu sorguya bağlar ve çalıştırır.
Avantajları:
-
SQL Injection'a karşı güvenlidir.
-
Sorgu sunucuya sadece bir kez hazırlanır, tekrar tekrar kullanılabilir.
-
Kodun okunabilirliğini artırır.
2. TEMEL KULLANIM
Prepared Statement kullanımı için kulalncıı ekleme işlemine bakalım..
Örnek: Kullanıcı Ekleme
<?php
$pdo = new PDO("mysql:host=localhost;dbname=ornek_veritabani;charset=utf8mb4", "root", "");
// Hazırlama
$sql = "INSERT INTO kullanicilar (isim, email) VALUES (:isim, :email)";
$stmt = $pdo->prepare($sql);
// Çalıştırma
$stmt->execute([
':isim' => 'Ahmet Yılmaz',
':email' => 'ahmet@example.com'
]);
?>
:isim ve :email yer tutucular (placeholders) olarak kullanılır. execute() içinde bu yer tutuculara karşılık gelen veriler dizi olarak verilir.
3. BINDPARAM ve BINDVALUE
bindParam()
bindParam() bir değişkene referansla bağlanır. Yani o değişkenin son hali, execute() sırasında kullanılır.
- Genellikle değeri sonradan değişecek değişkenler için tercih edilir.
Ne zaman kullanılır?
$stmt = $pdo->prepare("INSERT INTO ogrenciler (isim) VALUES (:isim)");
$isim = "Ali";
$stmt->bindParam(':isim', $isim);
$stmt->execute();
$isim = "Ayşe"; // Değişken değeri değişti
$stmt->execute(); // Yeni değerle çalışır: Ayşe
yada
<?php
$isim = "Mehmet Kaya";
$email = "mehmet@example.com";
$stmt = $pdo->prepare("INSERT INTO kullanicilar (isim, email) VALUES (:isim, :email)");
$stmt->bindParam(':isim', $isim);
$stmt->bindParam(':email', $email);
$stmt->execute();
?>
bindvalue()
bindValue() direkt o anda verilen değeri bağlar. Sonradan değişse bile etkilenmez.
- Daha sade, basit kullanımlarda önerilir.
Ne zaman kullanılır?
-
Değeri belli olan sabitleri bağlarken.
-
Birden çok veri girişi yapılmayacaksa.
-
bindParam'a göre daha hızlıdır çünkü referans gerekmez.
$stmt = $pdo->prepare("INSERT INTO ogrenciler (isim) VALUES (:isim)");
$stmt->bindValue(':isim', 'Fatma');
$stmt->execute();
yada
<?php
$stmt = $pdo->prepare("INSERT INTO kullanicilar (isim, email) VALUES (:isim, :email)");
$stmt->bindValue(':isim', 'Zeynep Kılıç');
$stmt->bindValue(':email', 'zeynep@example.com');
$stmt->execute();
?>
4 VERİ GÜNCELLEME ÖRNEĞİ
<?php
$sql = "UPDATE kullanicilar SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':email' => 'guncellenmis@example.com',
':id' => 3
]);
?>
5 VERİ SİLME ÖRNEĞİ
<?php
$sql = "DELETE FROM kullanicilar WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 5]);
?>
6 VERİ LİSTELEME (SELECT) ÖRNEĞİ
<?php
$sql = "SELECT * FROM kullanicilar WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => 'ahmet@example.com']);
$kullanici = $stmt->fetch(PDO::FETCH_ASSOC);
echo $kullanici['isim'];
?>
7 ÇOKLU KAYIT LİSTELEME
<?php
$stmt = $pdo->prepare("SELECT * FROM kullanicilar");
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "İsim: " . $row['isim'] . " - Email: " . $row['email'] . "<br>";
}
?>
Prepared statements kullanmak, hem uygulamanızın güvenliğini artırır hem de kodunuzu daha okunabilir ve sürdürülebilir hale getirir. Özellikle PDO ile veri tabanı işlemleri yaparken, prepare() ve execute() yapısını alışkanlık haline getirmek gerekir.