Prepared kalıpları benzer SQL komutlarını tekrarlayarak çalıştırmamızı sağlayan bir yapıdır.
Prepare kalıplarının kullanımı prepare() fonksiyonu ile başlar. Bu komut, tabloya veri eklemek için kullanılan INSERT INTO komutu için hazırlanan MySQL sorgusu içinde sadece sütun adlarını tanımlar, değerler alanında yer alan her bir sütun değeri için bir soru işareti koyar. Veritabanına gönderilen bu sorguya gerekli işlem yapılır ve sonuçlar kullanılmak üzere bekletilir.
$stmt = $bag->prepare("INSERT INTO personel (adi, soyadi, dogumtarihi) VALUES (?, ?, ?)");
Sonra, prepare() fonksiyonunun geri döndürdüğü değerin bind_param() fonksiyonu kullanılarak, her bir sütun değeri için tanımlanan değişkenler, bir karakter dizisi içinde, her bir sütun için tek bir karakter olmak üzere, veri tipini gösteren aşağıdaki karakterlerle bağlanır.
$stmt->bind_param("sss", $adi, $soyadi, $dogumtarihi);
i - integer d - double s - string b - BLOB
Daha sonra, sütun değerleri için tanımlanan değişkenlere atanan değerler execute() fonksiyonu ile, tabloya kaydedilir. Bu işlem değişkenlere yeni değerler atanarak istenilen sayıda tekrar edilebilir.
$stmt->execute();
Prepared kalıpları kullanmanın en büyük faydası SQL injection saldırılarına karşı sağladığı korumadır. Bunun yanı sıra, SQL sorgusuna yapılan işlem süresini kısaltır ve her kayıt girişinde tüm sorgunun yeniden işlem görmesine gerek kalmadığından sunucu işlemlerini kolaylaştırır.
1. MySQLi ile
<?php
$sunucu = "localhost";
$kullanici = "kullanıcıadı";
$parola = "parola";
$veritabani = "veritabaniadi";
// Bağlantı oluşturma
$bag = new mysqli($sunucu, $kullanici, $parola, $veritabani);
// Bağlantı kontrolü
if ($bag->connect_error) {
die("Bağlantı hatası: " . $bag->connect_error);
}
// Prepare() ve bind_param() fonksiyonlarının kullanımı
$stmt = $conn->prepare("INSERT INTO personel (adi, soyadi, dogumtarihi) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $adi, $soyadi, $dogumtarihi);
// Değerleri verme ve uygulama
$adi = 'Ahmet';
$soyadi = 'KARA';
$dogumtarihi = '1995-11-24';
$stmt->execute();
$adi = 'Mehmet';
$soyadi = 'AK';
$dogumtarihi = '1988-05-17';
$stmt->execute();
$stmt->close();
$bag->close();
?>
Yukarıdaki örnekteki kodlar, veritabanına bağlandıktan sonra, prepare() fonksiyonu kullanılarak INSERT INTO komutu için hazırlanan MySQL sorgusu içinde sadece sütun adlarını tanımlanır ve değerler alanında yer alan her bir sütun değeri için bir soru işareti koyulur. Veritabanına gönderilen bu sorguya gerekli işlem yapılır ve sonuçlar kullanılmak üzere bekletilir. Sonra, prepare() fonksiyonunun geri döndürdüğü değerin bind_param() fonksiyonu kullanılarak, her bir sütun değeri için tanımlanan değişkenler, bir karakter dizisi içinde, her bir sütun için karakter dizisi girişi yapılacağını gösteren s karakteri ile bağlanır. Daha sonra, sütun değerleri için tanımlanan değişkenlere atanan değerler execute() fonksiyonu ile, tabloya kaydedilir. Bu işlem değişkenlere yeni değerler atanarak istenilen sayıda tekrar edilebilir.
2. PDO yöntemi ile
<?php
$sunucu = "localhost";
$kullanici = "kullanıcıadı";
$parola = "parola";
$veritabani = "veritabaniadi";
try {
$bag = new PDO("mysql:host=$sunucu;dbname=$veritabani", $kullanici, $parola);
// PDO hata modunu istisnaya ayarlama
$bag->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $bag->prepare("INSERT INTO personel (adi, soyadi, dogumtarihi)
VALUES (:adi, :soyadi, :dogumtarihi)");
$stmt->bindParam(':adi', $adi);
$stmt->bindParam(':soyadi', $soyadi);
$stmt->bindParam(':dogumtarihi', $dogumtarihi);
// Değerleri verme ve uygulama
$adi = 'Ahmet';
$soyadi = 'KARA';
$dogumtarihi = '1995-11-24';
$stmt->execute();
$adi = 'Mehmet';
$soyadi = 'AK';
$dogumtarihi = '1988-05-17';
$stmt->execute();
}
catch(PDOException $e) {
echo "Hata: " . $e->getMessage();
}
$bag = null;
?>
Yukarıdaki örnekteki kodlar, veritabanına bağlandıktan sonra, MySQLi yönteminde prepare() fonksiyonu ile kullanılan ? ve bind_param() fonksiyonu ile kullanılan i, d, s ve b karakterleri yerine tablo sütun adlarının önüne : karakteri eklenerek kullanılır.