PHP Sürüm 5 ve öncesinde MySQL sunuculara bağlantı sağlayan MySQL eklentisi, çok başarılı olmasına rağmen MySQL sürüm 4.1 sonrası ile çalışırken sorunlar yaşamaktadır. Ayrıca MySQL eklentisi, bu sürümle sunulan yeni özellikleri ve protokollere destek verememektedir. Bu nedenle PHP geliştirilmesi ve bakımı karmaşık olan MySQL eklentisinin yerine MySQLi (MySQL Improved - Geliştirilmiş MySQL) eklentisini duyurmuştur. MySQLi eklentisi MySQL sürüm 4.1 sonrası sunulan yenilikleri etkin olarak kullanabilmekte ve güvenilir, geliştirilmesi kolay bir yapı sağlamaktadır. MySQLi ile sunulan en dikkat çekici yenilikler şu şekildedir;
- Object-Oriented Interface (Nesne Tabanlı Arabirim)
- Prepared Statements (Ön Hazırlıklı Sorgular)
Ancak MySQLi eklentisi, MySQL eklentisinden farklı olarak, varsayılan bağlantı oluşturmaz ya da komutlarda varsayılan bağlantıya işaret etmez. Bu nedenle MySQLi ile yürütülen komutlarda bağlantı işaretçisinin açıkça belirtilmesi gerekir.
MySQL ile bağlantı örneği | MySQLi ile bağlantı örneği |
<?php
$link = mysql_connect("Sunucu", "Kullanici", "Sifre");
mysql_select_db(“VeriTabani”);
mysql_query("SELECT * FROM Tablo");
mysql_close();
?> | <?php
$link = mysqli_connect("Sunucu", "Kullanici", "Sifre", “VeriTabani”);
mysqli_query($link, "SELECT * FROM Tablo");
mysqli_close($link);
?> |
Object-Oriented Interface (Nesne Tabanlı Arabirim)
MySQLi eklentisinin, MySQL eklentisi gibi kullanımının yanı sıra nesne tabanlı arabirimi de desteklemektedir. Bu sayede MySQLi, bakımı kolay ve etkin programlamaya olanak sağlar. Nesne tabanlı arabirim sayesinde;
- Bağlantı MySQLi türünden bir nesne olduğundan, ve yöntemler bu nesne üzerinde çalıştığından, komutlarda veritabanı bağlantsına işaret etmeye gerek kalmaz.
- Sorgu sonucu dönen sütunlar ilave işlemlere gerek kalmadan belirtilen nesneye atanabilir.
MySQLi kullanarak veritabanı üzerindeki verileri “$sonuc” değişkenine nesne olarak atayan ve sonuçların “sutun1” ile “sutun2” sütunlarını ekrana yazdıran örnek PHP kodu aşağıdaki gibidir;
<?php
$link = new mysqli(“Sunucu”, “Kullanici”, “Sifre”, “VeriTabani”);
$sorgu = $link->query(“SELECT *FROM Tablo”);
while($sonuc = $sorgu->fetch_assoc()) {
echo $sonuc[‘sutun1’];
echo $sonuc[‘sutun2’];
}
$link->close();
?>
Prepared Statements (Ön Hazırlıklı Sorgular)
MySQL 4.1 ile sunulan tampon bellek kullanımı özelliğiyle çalışan Prepared Statements (Ön Hazırlıklı Sorgular) sayesinde MySQL sorguları, MySQL sunucusuna şablon olarak gönderilir. MySQL sunucusu gönderilen şablonu, çalıştırılmaya hazır hale getirir ve tampon belleğinde saklar. Sorgunun gerçeklenmesi gerektiğinde ise, şablon üzerinde belirtilen veri alanları doldurularak şablon çalıştırılır. Böylelikle SQL Injection (SQL Enjeksiyon) gibi ataklardan korunmak için ek fonksiyonlara gerek kalmaz. Çünkü MySQL sunucusu çalıştırması gereken komutu inceleyip, hazır hale getirip, kendi belleğinde tuttuğundan atanan verilerle değiştirilebilmesi söz konusu değildir.
Ön hazırlıklı sorgularda sorgu MySQL sunucusuna gönderildikten sonra, çalıştırılma isteği gönderilmeden varsa değişkenler atanmaldır. Atama işlemi hazırlanan sorgu üzerinden data_bind() (Veri Bağla) metodu çağırılarak yapılır. Sorgunun çalıştırılmasını ise execute() (Çalıştır) metodu sağlar. Ön hazırlıklı sorgu kullanarak işlem yapan örnek PHP kodu aşağıdaki gibidir;
<?php
$link = new mysqli(“Sunucu”, “Kullanici”, “Sifre”, “VeriTabani”);
$sorgu = $link->prepare(“INSERT INTO Tablo (Ad, Soyad) VALUES(?, ?)”);
$sorgu->data_bind(“ss”, “TestAd”, “TestSoyad”);
$sorgu->execute();
$sorgu->close();
$link->close();
?>
Hazırlanan nesne üzerinden çağırılan data_bind() metodu, hazırlanmış sorguya ileteceği değişkenlerin tiplerine ihtiyaç duyar. Yukarıdaki örnek programda değişkenlerin ikisi de string (katar) türünden olduğu için “ss” parametresi kullanılmıştır. Verilerin tipleri ve belirtilmesi gereken parametreler aşağıdaki tabloda belirtilmiştir.
Bağlama Tipi | Veri Tipi |
i | Tam Sayılar - int |
d | Kesirli Sayılar - float ve double |
b | Blob (Kabarık Veri) |
s | Diğer Türler |
Performans Testleri
Aynı görevi yerine getiren MySQL, MySQLi ve ön hazırlıklı MySQLi kullanarak oluşturulmuş test programlarında Insert (Ekle), Select (Seç) ve Delete (Sil) işlemleri on biner kez tekrarlanmıştır. Örnek olarak, test programının Select (Seç) komutu için MySQLi tarafı şu şekildedir;
<?php
$tq = 10000;
$mt = microtime();
$link = mysqli_connect("Sunucu", "Kullanici", "Sifre", "VeriTabani");
for($i=0; $i<$tq; $i++){
$link->query("SELECT * FROM Tablo LIMIT 1");
}
$link->close();
$et = microtime() - $mt;
print "Select: " . $et . "s\n";
?>
Programlar MySQL ve MySQLi ile gerekli sorgular için düzenlenip çalıştırıldıklarında sorguları gerçekledikleri süreler mikrosaniye olarak şu şekilde oluşmuştur;
Yenilikleri oldukça etkileyici olmasına rağmen MySQLi eklentisi özellikle ekleme ve silme işlemlerinde, MySQL eklentisine göre daha yavaş işlem yapmaktadır. Ancak gelişim aşamasını hızla sürdürmektedir, ayrıca PHP 5 sürümü ile MySQL eklentisinin bakımlar haricinde her hangi bir gelişme yaşamayacağını duyurmuştur. Bu nedenle yeni projelerde MySQLi eklentisini kullanılması önerilmektedir.