Konular

MySQLi Nedir?

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)
  • SQL İnjection ve diğer  saldırıları karşı koruma
  • Daha yüksek performans
  • Daha çok ve daha kullanışlı fonksiyonlar
  • Birden fazla veritabanına bağlanma gibi bir durumda daha faydalıdır.
  • Veritabanı karışıklığını önler.

PHP’de kendi resmi dökümantasyonunda da bunun sinyalini vermeye başlamış; “mysql” fonksiyonlarının sayfasında aşağıdaki gibi bir öneriyle karşılaşıyoruz;

This extension is not recommended for writing new code. Instead, either the mysqli or PDO_MySQL extension should be used. See also the MySQL API Overview for further help while choosing a MySQL API.

Özetle artık bunları kullanmanızı önermiyoruz, PDO ya da MySQLi‘ye geçin diyor. 

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.

<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);

// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);
?>
 

  MySQLi Nedir?

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.

Sonuçtan Tek Değer  Almak (mysql_result)

$mysqli->query("SELECT name FROM contacts WHERE id = 5")->fetch_object()->name 

Multi Query

  Birden fazla Query'nin tek bir satırda yazılması

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %sn", mysqli_connect_error());
    exit();
}

$query  = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* execute multi query */
if ($mysqli->multi_query($query)) {
    do {
        /* store first result set */
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%sn", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("-----------------n");
        }
    } while ($mysqli->next_result());
}

/* close connection */
$mysqli->close();
?>
 

 

$mysqli->multi_query() sonrası $mysqli->query() de oluşan hatayı çözmek için:

<?php
    // WORKING CODE:
    $mysqli->multi_query(" Many SQL queries ; "); // OK

    while ($mysqli->next_result()) // flush multi_queries
    {
        if (!$mysqli->more_results()) break;
    }

    $mysqli->query(" SQL statement #1 ; ") // now executed!
    $mysqli->query(" SQL statement #2 ; ") // now executed!
    $mysqli->query(" SQL statement #3 ; ") // now executed!
    $mysqli->query(" SQL statement #4 ; ") // now executed!
?>

 

Mysqli Transaction (Sorguların Geri Alınabilmesi)

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %sn", mysqli_connect_error());
    exit();
}

$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");

/* set autocommit to off */
$mysqli->autocommit(FALSE);

/* Insert some values */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");

/* commit transaction */
if (!$mysqli->commit()) {
    print("Transaction commit failedn");
    exit();
}

/* Rollback */
$mysqli->rollback();


/* drop table */
$mysqli->query("DROP TABLE Language");

/* close connection */
$mysqli->close();
?>

Field Name (Tablo Başlıkları) İşlemleri  

$Sorgu = $mysqli->query("SELECT * FROM $Tablo LIMIT 1");
$KolonSayisi = $Sorgu->field_count;

$Kolonlar = $Sorgu->fetch_fields();
   
foreach ($Kolonlar as $Kolon) {

   $KolonAdi = $Kolon->name;
   $KolonTipi = $Kolon->type;

}

 

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 . "sn";
?>

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;

MySQLi Nedir?

MySQLi Nedir?

MySQLi Nedir?

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.

 

 

 

Kaynaklar:

Yorumunuzu Ekleyin

PHP Data Objects (PDO) Nedir?
Yükleniyor...