Php ile mysql prepare statements kullanımı

Tarih: 24 Ocak 2013 Kategori: Mysql, Php 1 Yorum

php mysql preparePrepare, execute edilmek (çalıştırılmak) üzere bir sql deyimini hazırlar. Performans arttırıcı etkisinin yanı sıra sql injection saldırılarını engellemede yardımcı olur. Mysql prepare, Php 5 ile gelen mysqli kütüphanesi ve Pdo ile kullanılabilir. Bu ifade aynı sorguyu farklı yerlerde birçok kez kullanmamıza imkân sağlar. Bu işlemin mantığı şudur, Mysql’e daha sonra kullanmak üzere bir sorgu şablonu gönderirsiniz, daha sonra şablonda belirttiğiniz işaretleri değiştirerek sorgu şablonunuzu istediğiniz kadar kullanabilirsiniz. Özellikle toplu veri girişlerinde faydalı olmakla beraber, veri çekerken ve veri güncellerken de kullanılır.

Eğer mysqli hakkında bilginiz yoksa bu yazıdan önce şu yazıyı okumanızı öneririm.

Örnek Mysql Prepare Kullanımı

Üyeler isimli bir tablomuz olduğunu farz edin,  uyeno ve uyead isimli iki sütunumuz olsun.

<?php
$uye = 'altayalp';
$sorgu = 'insert into uyeler(uyead) values(?)';
$ifade = $vt->prepare($sorgu);
$ifade->bind_param('s',$uye);
$ifade->execute();
echo $ifade->affected_rows;
$ifade->close();
?>

Kodlarımızı açıklayalım. Öncelikle veritabanına bağlanmış ve bağlantı nesnesi oluşturmuşsunuz kabul ediyorum. Bağlantı nesnemiz $vt değişkeninde depolanıyor. Veri eklemek için bir insert ifadesi yazıyoruz buradaki tek fark eklenecek veri yerine ? (soru işareti) kullanmamızdır. Soru işareti verilerle değiştirmek için kullanılan işarettir ve tırnak içerisinde yer almamalıdır. Pdo ile prepare kullanırken ? yerine isim eşleşmeleri de kullanabiliriz. Birazdan anlatacağım. $vt->prepare() (ki kendisi bahsi geçen işlemimizdir) kendisine geçirilen sorguyu daha sonra kullanmak üzere yapılandırır. $ifade->bind_param() metodu sorgumuzda belirttiğimiz ? yerine geçirilecek veriyi belirler. bind_param() metodunun aldığı ilk parametre eklenecek verinin tipini belirtmek için kullanılır. Bizim burada kullandığımız ‘s’ verinin string tipinde olduğunu belirtir. Verinin tipini belirten ilk ifadeden sonra soru işaretiyle aynı sayıda değişken belirtmek gerekir. bind_param() ile veri tipini belirtmek için kullanılabilecek 4 karakter vardır:

İ = integer
d = double
s = string
b = blob

$ifade->execute() adından da anlaşıldığı gibi ifademizi çalıştırarak işlemi gerçekleştirir. echo $ifade->affected_rows ise sorgudan etkilenen satır sayısını ekrana yazdırır. Son olarak da $ifade->close() ifademizi sonlandırır.

Yukarıdaki örneğimiz basit bir mysqli prepare işlemiydi fakat yinede mysqli ile örneklerle devam etmek istiyorum. En son select ile prepare kullanımına bir örnekle yazıyı bitireceğim.

Mysqli Prepare Örneği Nesne Yönelimli Söz Dizimi

<?php
$vt = new mysqli('localhost', 'root', '12345678','deneme');
$no = 2;
$uye = 'yeniüye';
$sorgu = 'insert into uyeler(uyeno,uyead) values(?,?)';
$ifade = $vt->prepare($sorgu);
$ifade->bind_param('is',$no,$uye);
$ifade->execute();
echo $ifade->affected_rows;
$ifade->close();
?>

Mysqli Prepare Örneği Prosedürel Söz Dizimi

<?php
$no = 3;
$uye = 'Yeni üyemiz';
$vt = mysqli_connect('localhost', 'root', '12345678','deneme');
$sorgu = 'insert into uyeler(uyeno,uyead) values(?,?)';
$ifade = mysqli_prepare($vt,$sorgu);
mysqli_stmt_bind_param($ifade,'is',$no,$uye);
mysqli_stmt_execute($ifade);
echo mysqli_affected_rows($vt);
mysqli_stmt_close($ifade);
?>

Pdo ile Mysql Prepare Kullanımı

<?php
$no = 4;
$uye = 'yeniüye';
$vt = new PDO('mysql:dbname=deneme;host=localhost','root','12345678');
$sorgu = 'insert into uyeler(uyeno,uyead) values(?,?)';
$ifade = $vt->prepare($sorgu);
$ifade->execute(array($no,$uye));
echo $ifade->rowCount();
?>

Mysqli kullanımıyla bir hayli benzedikleri dikkatinizi çekmiştir. Bir örnek de Pdo ile isim eşleşmeli olarak yapalım.

<?php
$no = 2;
$uye = 'yeniüye';
$vt = new PDO('mysql:dbname=deneme;host=localhost','root','12345678');
$sorgu = 'insert into uyeler(uyeno,uyead) values(:uyeno,:uyead)';
$ifade = $vt->prepare($sorgu);
$ifade->execute(array('uyeno'=>$no,'uyead'=>$uye));
echo $ifade->rowCount();
?>

Prepare kullanırken hem isim hem de ? eşleştirmeleri kullanamazsınız ve isimli eşleştirmeler benzersiz olmalıdır.

Select ile Prepare Kullanımı

Son örneği select cümleciği ile prepare kullanımına veriyorum.

<?php
$no = 1;
$vt = new mysqli('localhost', 'root', '12345678','deneme');
$sorgu = 'select * from uyeler where uyeno= ?';
$ifade = $vt->prepare($sorgu);
$ifade->bind_param('i',$no);
$ifade->execute();
$ifade->bind_result($uyeno,$uyead);
$ifade->fetch();
echo "$uyeno - $uyead";
$ifade->close();
?>

Yukarıda kullandığımız bind_result() sorgu sonuçlarını değişkenlere aktarmamızı sağlıyor, fetch() ise sorgu sonuçlarını getiriyor. Şimdilik bu kadar. Herkese iyi çalışmalar.

1 Yorum

Yorum Yapın