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.
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.
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.
bindParam()
bir değişkene referansla bağlanır. Yani o değişkenin son hali, execute()
sırasında kullanılır.
Ne zaman kullanılır?
Aynı prepared statement içinde birden çok farklı veriyle işlem yapmak istiyorsan.
Döngü içinde prepared statement tekrar tekrar kullanılacaksa.
$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()
direkt o anda verilen değeri bağlar. Sonradan değişse bile etkilenmez.
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();
?>
<?php
$sql = "UPDATE kullanicilar SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':email' => 'guncellenmis@example.com',
':id' => 3
]);
?>
<?php
$sql = "DELETE FROM kullanicilar WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 5]);
?>
<?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'];
?>
<?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.
Hocam valla çok işe yaradı , teşekkür ederim.
18 5 YanıtlaRİca ederim, çok sevindim..
14 0 YanıtlaToplam 32 Makale
Lütfen yorumlarınızda saygılı, yapıcı ve anlaşılır bir dil kullanın.
Küfür, hakaret ya da spam içerikler onaylanmaz.