Rehber Yeni Başlayanlar İçin PHP; PDO ve MySql'i Anlamak

Arkadaşlar merhaba PHP'de veritabanlarına giriş yapan arkadaşlarda temel düzeyde MySQL ve PDO'yu anlamakta sorun çektiklerini birçok defa gördüm ve bu yazıyı yazma gereği duydum. Birçok kişiye yardımcı olacağını düşünüyorum.

Nedir bu MySQL?
MySQL 1995 yılında Oracle tarafından PHP ile aynı yılda piyasaya sürülen bir veritabanı yazılımıdır. Bilindik çoğu veritabanı yazılımından farklı olarak "Server Based" bir şekilde çalışır. Yani bilgilere/veritabanı dosyalarına farklı sunuculardan ek bir aracı yazılım/sistem olmadan direkt olarak erişilebilir. Bu kısmı şuan anlamamış olabilirsiniz. Daha iyi kavramak için MySQL öğrendikten sonra farklı programlama dillerinde farklı veritabanı yazılımları kullanmak taşları yerine oturtacaktır ve size mantığı kavramanızda yardımcı olacaktır.


PHP ve MySQL...
PHP ve MySQL farklı yazılımlardır fakat beraber kullanılabilirler. PHP ile bir MySQL veritabanına erişim sağlayıp bilgi ekleyebilir, düzenleyebilir ve kaldırabilirsiniz. Ayrıca bir MySQL sunucusuna erişim sağladığınızda yeni veritabanları oluşturabilir bu veritabanlarına tablolar ekleyebilir, özelliklerini düzenleyebilir ve silebilirsiniz.
Fakat bu işlemlerin tümünü yapmak için PHP ile beraber gelen bir extension(uzantı) kullanılır. Bu uzantı "MySQLi"dir. Kendisi PHP ile MySQL yazılımı arasında iletişim kurmamızı sağlayan bir yazılımdır diyebiliriz. Fakat bu yazılım PHP yazılımının içinde bulunan bir parçadır. Yani MySQLi, PHP'nin bir parçasıdır.



MySQL(i) ve PDO arasındaki fark nedir?
Arkadaşlar MySQL kendisi başlı başlına bir yazılımdır. MySQL'e bir uygulama diyebiliriz ama PDO bir yazılım değil bir Framework'tür. Yani sizler için yazılmış ve hazır olarak kullanmanız için sunulan fonksiyonlar topluluğudur diyebiliriz.
Önceden MySQLi'den bahsetmiştik. MySQLi'nin zaten kendi fonksiyonları vardır. Bu fonksiyonlar ile istenilen bütün işlemleri yapabiliriz(Veritabanı bağlantısı, bilgi ekleme, düzenleme, silme...). Peki PDO'nun burdaki işlevi tam olarak nedir?

PDO, MySQLi kodlarından ibarettir. Bize olan faydası ise kodları OOP(bu konu hakkında bir bilginiz yoksa MySQL öğrenmeden önce OOP konusunu araştırın ve alıştırma yapın)'ye uygun bir şekilde yazabilmemizi sağlaması ve GÜVENLİK AÇIKLARININ ÇOĞUNU KAPATMASIDIR.

Velhasıl PDO, MySQLi'yi daha kullanışlı hale getiren bir frameworktür.


SQL'i Anlamak
SQL bilinenin aksine bir yazılım değil bir dildir. Bunu Türkçe gibi düşünebiliriz. SQL, Türkçe iken MySQL cümledir. SQL size kelimeleri verir, anlamları öğretir. Bu kelimeleri MySQL içerisinde kullanırsınız. Ama şunu unutmamak gerekir. SQL'i öğrenirseniz çoğu veritabanı yazılımını %70 öğrenmiş olursunuz çünkü zaten dili öğrenmiş olursunuz kalanı farklı cümle kurma tekniklerinden başka bir şey değildir.

PDO Terimleri: New, Query, Prepare, Fetch

New: Arkadaşlar "new" anahtar kelimesi PDO'ya ait değil direkt bir PHP kodudur. Önceden belirttiğim gibi OOP'yi araştırırsanız ne demek istediğimi anlarsınız.

Query: Bir MySQL kodu çalıştırmak istediğimizde bu fonksiyona başvururuz.
Örnek Kod:
PHP:
<?PHP

//Veritabanı bağlantı işlemlerinin yapıldığı varsayılarak

$sorgu = $db->query("SELECT * FROM kullanicilar WHERE id=1");

?>

Prepare: Bir MySQL kodu çalıştırmak istediğimizde bu fonksiyona başvururuz fakat "Query"den farklı olarak Prepare kullandığımızda MySQL koduna belli parametreler(ÖR: Kullanıcının input ile verdiği e-mail adresine göre bilgilerin çekilmesi) verebiliriz.
Örnek Kod:
PHP:
<?PHP
//Veritabanı bağlantı işlemlerinin yapıldığı varsayılarak
$sorgu = $db->prepare("SELECT * FROM kullanicilar WHERE mail=?");
?>

Execute: Prepare'dan istenilen parametreler alındıktan sonra bu parametrelerin değerlerini belirtmek için kullanırız
Örnek Kod:
PHP:
<?PHP
//Veritabanı bağlantı işlemlerinin yapıldığı ve input ile post türünde verinin alındığı varsayılarak
$sorgu = $db->prepare("SELECT * FROM kullanicilar WHERE mail=?");
$sorgu->execute([$_POST['kullanici_mail']]);
?>

Fetch: Query ve Prepare ile yapılan işlemlerin sonucunu çekmek için kullanırız. Burda şöyle bir soru sorabilirsiniz neden sonuç direkt olarak işlemin yapıldığı değişkene verilmiyor. Örneğin $sorgu = $db->query("SELECT * FROM kullanicilar WHERE id=1"); kodu yazıldığında neden direkt olarak sorgu değişkeni sonuç değerini almıyor? Çünkü bir işlem yapılırken o işlemin bir veri çekme işlemimi, düzenleme veya silme işlemi mi olduğunu yazılım otomatik olarak anlayamaz. Ayrıca kullanışlılık açısından da mantıksal olarak pek uygun olmaz. Örnek olarak verdiğim kodda sorgu değişkeni sonucu almaz ama işlemin başarılı olup olmadığı bilgisini alır. Bu şekilde işlem başarısız olursa sorgu değişkeninin değerine bakabilir ve farklı işlemler yapabiliriz.
Örnek Kod:
PHP:
<?PHP
//Veritabanı bağlantı işlemlerinin yapıldığı ve input ile post türünde verinin alındığı varsayılarak
$sorgu = $db->prepare("SELECT * FROM kullanicilar WHERE mail=?");
$sorgu->execute([$_POST['kullanici_mail']]);
$bilgiler=$sorgu->fetch();
?>

Ek Bilgi: Prepare dediğimiz şey MySQLi'de yoktur. Prepare işlemlerini MySQLi kodları ile yazmak istersek sorgu stringini PHP kodları ile şekillendirmeliyiz. Ama bu güvenlik açısından "SQL injection" gibi saldırılar için açık vermek olur. Bu açıkları elle kapatmak kafa yorar ve baş ağrıtır. PDO bizim için prepare içerisinde bu açıkları zaten kapatmıştır ve gönül rahatlığıyla kullanabiliriz.




Evet arkadaşlar size elimden geldiğince en temel halleriyle MySQL'in ne olduğunu, PDO'nun ne işe yaradığını ve temel PDO terimlerini anlatmaya çalıştım. PDO'ya ilk başladığımda böyle bir yazıyla karşılaşsaydım açıkçası aklımdaki çoğu soru işareti kalkmış olurdur. Neden bu böyle neden şu şöyle gibi sorular sormazdım. Umarım sizlere de yardımcı olmuştur.
 

Yeni konular

Geri
Yukarı