Tag Archives: prepared statements

PHP: Prepared Statements: PDO Class

Bu anlatımımda php’de PDO classını kullanarak Prepared Statements hazırlayacağız. Öncelikle prepared statements’ın ne olduğuyla başlayalım. Prepared statement: Direk türkçe karşılığı gibi olacak ama daha önceden hazırlanmış ve ileride çalıştırılacak bir durum. Ne faydası var ?

mysql_query("SELECT * FROM liste WHERE id = 1");
mysql_query("SELECT * FROM liste WHERE id = 2");
mysql_query("SELECT * FROM liste WHERE id = 3");

gibi 3 tane sorgumuz olduğunu varsayalım. Her 3 sorguda da veritabanı kendini hazırlıyor ve queriyi çalıştırıyor. Prepared Statements’ta sorgumuzu bir kere hazırlıyoruz ve ardından id değerlerini değiştirip çalıştırıyoruz. Yani sorgumuzu 3 kez hazırlamadık 1 kez hazırladık ve 3 kez çalıştırdık. Bu da performans artışı demek oluyor :). Prepared Statements bizi SQL Injectionlardan da koruyor aynı zamanda. Şuraya da bir göz atabilirsiniz: 
http://www.cangelis.com/neden-pdo-veya-mysqli-kullanmaliyiz/

Şimdi gelelim PDO’yu nasıl kullanıyoruz. İlk olarak constructor:

PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] ) 

$dsn: Data source name, genelde PDO Driver ismidir. İşimiz veritabanları olduğu için şöyle örnekler vereyim: mysql için: mysql:host=hostname;dbname=ssldb SQLite: sqlite:/tmp/foo.db gibi örnekler verebiliriz.

$username, $password: kullanıcı adı şifre.

$driver_options: driver ile ilgili seçenekler. http://tr2.php.net/pdo PDO Drivers altında veritabanları var, içlerinde seçenekler konusunda bilgiler var.

$db = new PDO("mysql:host=localhost;dbname=test","root","şifre");

işte mysql bağlantımızı kurduk 🙂 Şimdi ise en üstteki örneğimizi PDO classını kullanarak, çalıştıralım.

prepare (hazırla):

PDOStatement PDO::prepare ( string $statement [, array $driver_options = array() ] ) 

ilk parametremiz $statement queryimiz oluyor 2. si ise $driver_options yukarıda anlattığım gibi.

yukarıda oluşturduğumuz bağlantı üzerinden;

$stmt = $db->prepare("SELECT * FROM liste WHERE id = ?");

prepare fonksiyonu PDOStatement objesi döndürür. Bunuda $stmt (statement’ın kısaltılmışı) değişkenine kaydediyoruz. Ve statement’ımızı çalıştırıyoruz:

bool PDOStatement::execute ([ array $input_parameters ] ) 

Çalıştırmak için execute() kullanıyoruz. Parametre olarak sorguya gönderilecek değerleri array olarak alıyor. Sonucunda başarı durumuna göre true veya false döndürüyor.

$stmt->execute(array(1));
$stmt->execute(array(2));
$stmt->execute(array(3));

Şimdi ise farklı bir yöntem kullanarak sorgumuza değişken bağlayacağız. Nasıl ? Sorgumuzu şöyle prepare ettiğimizi varsayalım (parametreler her zaman : ile başlar)

$stmt = $db->prepare("SELECT * FROM liste WHERE id = :id");

:id diye bir parametre ekledik. Daha sonra bu parametreye bir değişken bağlayacağız.

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

bindParam fonksiyonu ile. Parametrelerini inceleyelim,

$parameter: parametre (örneğimizde “:id”)

$variable: buraya hangi değişkene bağlıyacağımızı belirliyoruz dikkat ederseniz $variable’ın başında “&” işareti var bu değişkenin değeri değil değişkenin referansının gönderildiği anlamına geliyor. Örnekte daha iyi anlayacaksınız.

$data_type: veri tipimiz (integer,string vs.) zorunlu değildir.

$length: uzunluk, zorunlu değildir.

$driver_options: daha önce anlatmıştım, zorunlu değildir.

bir yukarda sorgumuzu hazırladık şimdi değişkenimizi bağlayalım.

$stmt->bindParam(":id",&$id);

$id değişkenini bağladık. Şimdi nasıl execute() edeceğiz görelim.

$id = 1;
$stmt->execute();
$id = 2;
$stmt->execute();
$id = 3;
$stmt->execute();

bu kadar basit. Değer değiştikçe execute edilecek sorguda değişiyor. Çünkü $id değişkeninin referansını gönderdik, değerini değil. Şimdi sorgumuzun sonucunu alalım.

array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] ) 

parametrelerin ne anlama geldiğini http://tr2.php.net/manual/en/pdostatement.fetchall.php adresinden öğrenebilirsiniz. Çok fazla detaya girmek istemiyorum. Fonksiyon sonuç olarak bir sonuç arrayi döndürüyor.

$sonuc = $stmt->fetchAll();
print_r($sonuc);

işte bu kadar sonuçlarımızda aldık. Dilerseniz bir foreach döngüsüyle $sonuc‘u işleyebilirsiniz. PDO’nun daha birçok fonksiyonu var ama en temel olanlar bunlar. İstek olursa hepsini farklı bir anlatımda anlatabilirim. Kolay gelsin. Son kodumuzuda yazayım:

$db = new PDO("mysql:host=localhost;dbname=test","root","şifre");
$stmt = $db->prepare("SELECT * FROM liste WHERE id = :id");
$stmt->bindParam(":id",&$id);
$id = 1;
$stmt->execute();
$sonuc = $stmt->fetchAll();
print_r($sonuc);
$id = 2;
$stmt->execute();
$sonuc = $stmt->fetchAll();
print_r($sonuc);
$id = 3;
$stmt->execute();
$sonuc = $stmt->fetchAll();
print_r($sonuc);