Günler geçiyor PHP versiyonları yükseliyor mysql_ fonksiyonlarını kullanmayın uyarıları artıyor, PDO veya mysqli kullanın deniyor. Bu yazımda bu konu hakkında biraz konuşacağım.
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);