Neden PDO veya mysqli kullanmalıyız

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.

Hatırlatma

Öncelikle şunu bilmemiz gerekiyor; – Hiç bir fonksiyon sizi sql injection’dan korumaz. Bundan dolayı müyendizler Prepared Statements’ı icat etmişler.

PDO ve mysqli

PDO ve mysqli Prepared Statements kullanan 2 farklı araçtır. PDO’nun mysqli’e göre avantajı farklı veritabanı türleriyle beraber çalışabilmesi, ancak mysqli, adından da anlaşılacağı gibi sadece mysql üzerinde çalışmakta.

Prepared Statements

Adı üzerinde hazırlanmış ifadeler. Yani ifadeler (sql cümleleri) daha önceden hazırlanır ve sonra çalıştırılır.

Neden Prepared Statements ?

Başlıca sebepler;

  1. Performans
  2. Güvenlik

Performans

Geleneksel sql araçlarında (mysql_* fonksiyonlarında) sorgu her çalıştırıldığında sql cümlesi yorumlayıcı tarafından her defasında derlenir (yorumlanır) ve çalıştırılır. Ancak Prepared Statement’larda belirli bir cümle birden fazla kez çalıştırılıyorsa o cümle bir kez yorumlanır, çok kez çalıştırılır.

Güvenlik

Prepared Statement’lar SQL Injection‘dan korur. Ama nasıl ? Basit bir sql cümlesini ele alalım:

SELECT * FROM uyeler WHERE id = 1

bu cümlede parametremiz 1‘dir. Asıl cümlemiz 1’den önceki kısımdır. Kısacası 1 bizim için değişkendir. Şöyle bir şey olsa;

$ifade = hazirla("SELECT * FROM uyeler WHERE id = ?"); 

burada $ifade değerine ifademizin hazırlanmasını söyledik ve parametremizin yerine ? koyduk. Daha sonra;

$ifade->bagla(1);

ile bu ifadeye parametre değerimizi bağlasak yani 

? yerine artık 1 olsa ve ifademizi çalıştırsak;

$ifade->calistir();

SQL Injection’dan korunmuş oluruz.

Peki Nasıl?

Öncelikle asıl cümlemiz bu:

SELECT * FROM uyeler WHERE id = ? 

Yani:

SQL Yorumlayıcısı sql cümlesini yorumlarken (derlerken) sadece bu cümleyi derleyecek. ? yerine gelecek herhangibir değer yorumlayıcı tarafından yorumlanmayacak. Orası yorumlanmadığı için orada SQL ile ilgili herhangibirşey olsa da o sadece bir değer, bizim SQL parçamız ile alakası yok. Bu şekilde SQL Injection‘dan korunmuş oluruz.

Performans konusuna geri dönüş

Görüldüğü gibi hazirla ile ifademiz hazırlandı şimdi birden fazla kez nasıl çağırırız bakalım

$ifade->bagla(2);
$ifade->calistir();
$ifade->bagla(3);
$ifade->calistir()
$ifade->bagla(4);
$ifade->calistir();

görüldüğü gibi $ifade bir kez derlendi ancak 1den fazla kez çalıştırıldı bu da bize performans kazandırdı. İyi çalışmalar.

7 thoughts on “Neden PDO veya mysqli kullanmalıyız

  1. Ali Burak

    Peki PDO ile SQL injection tamamen bitti mi? Yani bu olay injection’ı %100 engelledi mi yoksa güvenliği biraz daha mı artırdı? Teşekkürler.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax