PHP ile web uygulamaları geliştirirken kullanıcı bilgilerini, ürünleri, öğrenci kayıtlarını veya diğer verileri kalıcı olarak saklamamız gerekebilir. Bu tür işlemler için veritabanı sistemlerinden yararlanılır.
PHP programlama dilinde veritabanlarıyla çalışmak için kullanılan yöntemlerden biri PDO (PHP Data Objects) yapısıdır.
PDO sayesinde PHP uygulamalarından MySQL gibi veritabanı sistemlerine bağlanabilir, veri ekleme, listeleme, güncelleme ve silme işlemlerini gerçekleştirebiliriz.
Bu dersimizde PDO'nun ne olduğunu, nasıl çalıştığını, MySQL veritabanına nasıl bağlanıldığını ve bağlantı sırasında oluşabilecek hataların nasıl yönetildiğini örneklerle öğreneceğiz.
Veritabanı, bilgilerin düzenli bir şekilde saklanmasını, yönetilmesini ve gerektiğinde kullanılmasını sağlayan sistemdir.
Örneğin bir okulda öğrencilerin adları, soyadları, sınıfları ve okul numaraları veritabanında saklanabilir.
Bir öğrenci tablosu aşağıdaki gibi olabilir:
| ID | Ad | Soyad | Sınıf |
|---|---|---|---|
| 1 | Ahmet | Yılmaz | 11-A |
| 2 | Ayşe | Demir | 11-B |
| 3 | Mehmet | Kaya | 11-A |
Bu örnekte her satır bir öğrenci kaydını, her sütun ise öğrenciye ait bir bilgiyi temsil eder.
Veritabanları sayesinde binlerce kaydı düzenli biçimde saklayabilir ve ihtiyaç duyduğumuz bilgilere hızlıca ulaşabiliriz.
MySQL, ilişkisel veritabanı yönetim sistemlerinden biridir.
MySQL üzerinde veritabanları ve tablolar oluşturabilir, bu tablolara kayıt ekleyebilir ve mevcut kayıtları yönetebiliriz.
MySQL veritabanlarında işlemler genellikle SQL (Structured Query Language) adı verilen sorgulama diliyle gerçekleştirilir.
SQL kullanılarak aşağıdaki işlemler yapılabilir:
Bu işlemleri sonraki derslerimizde PDO kullanarak ayrıntılı şekilde öğreneceğiz.
PDO, PHP Data Objects ifadesinin kısaltmasıdır.
PDO, PHP uygulamalarının farklı veritabanı sistemleriyle iletişim kurmasını sağlayan bir veritabanı erişim arayüzüdür.
PDO ile aşağıdaki veritabanı sistemlerine uygun sürücüler aracılığıyla bağlanılabilir:
PDO'nun en önemli avantajlarından biri, farklı veritabanı sistemleri için ortak bir PHP programlama arayüzü sunmasıdır.
Ancak her veritabanının SQL söz dizimi ve özellikleri tamamen aynı değildir. Farklı bir veritabanına geçildiğinde bazı SQL sorgularının değiştirilmesi gerekebilir.
PDO, PHP uygulamalarında veritabanı işlemlerini daha düzenli ve güvenli şekilde gerçekleştirmeye yardımcı olur.
Başlıca avantajları şunlardır:
Özellikle kullanıcıdan alınan verilerin SQL sorgularına güvenli biçimde aktarılması açısından PDO'nun parametreli sorgu desteği önemlidir.
PDO ile MySQL veritabanına bağlanabilmek için bilgisayarımızda PHP ve MySQL sunucusunun çalışıyor olması gerekir.
Bu dersimizde yerel geliştirme ortamı olarak XAMPP kullanıldığını varsayacağız.
XAMPP içerisinde genellikle şu bileşenler bulunur:
XAMPP Control Panel üzerinden Apache ve MySQL servislerini başlatalım.
Ardından tarayıcımızdan aşağıdaki adresi açalım:
http://localhost/phpmyadmin
Bu adres üzerinden phpMyAdmin arayüzüne erişebiliriz.
PDO bağlantısını gerçekleştirmeden önce MySQL üzerinde bir veritabanı oluşturmamız gerekir.
Bunun için aşağıdaki adımları uygulayalım:
Böylece okul isimli veritabanımız oluşturulmuş olacaktır.
Bu işlemi SQL komutuyla da gerçekleştirebiliriz:
CREATE DATABASE okul
CHARACTER SET utf8mb4
COLLATE utf8mb4_turkish_ci;
Veritabanımızı oluşturduktan sonra PHP ile bağlantı kurmaya başlayabiliriz.
PDO ile veritabanı bağlantısı oluşturmak için new PDO() ifadesi kullanılır.
Genel kullanım şekli aşağıdaki gibidir:
<?php
$db = new PDO(
"mysql:host=localhost;dbname=okul;charset=utf8mb4",
"root",
""
);
?>
Bu örnekte localhost üzerinde bulunan okul isimli MySQL veritabanına bağlantı oluşturulmuştur.
Buradaki root kullanıcı adı ve boş parola, yalnızca bu şekilde yapılandırılmış yerel XAMPP ortamı için örnek olarak kullanılmıştır. Gerçek sunucularda ayrı bir veritabanı kullanıcısı ve güçlü bir parola kullanılmalıdır.
PDO bağlantısında kullanılan bilgileri ayrı ayrı inceleyelim.
| Parametre | Açıklama |
|---|---|
| mysql | Kullanılacak veritabanı sürücüsünü belirtir. |
| host=localhost | Veritabanı sunucusunun adresini belirtir. |
| dbname=okul | Bağlanılacak veritabanının adını belirtir. |
| charset=utf8mb4 | Bağlantıda kullanılacak karakter kümesini belirtir. |
| root | Veritabanı kullanıcı adıdır. |
| "" | Örnekte boş bırakılmış veritabanı parolasıdır. |
Bağlantı bilgilerini içeren ilk parametreye DSN (Data Source Name) adı verilir.
DSN, hangi veritabanına ve hangi sunucu üzerinden bağlanılacağını belirtir.
Veritabanı bağlantısı sırasında sunucunun çalışmaması, veritabanı adının yanlış yazılması veya kullanıcı bilgilerinin hatalı olması gibi sorunlarla karşılaşabiliriz.
Bu tür hataları yönetmek için önceki dersimizde öğrendiğimiz try-catch yapısından yararlanabiliriz.
<?php
try {
$db = new PDO(
"mysql:host=localhost;dbname=okul;charset=utf8mb4",
"root",
""
);
echo "Veritabanı bağlantısı başarılı.";
} catch (PDOException $hata) {
echo "Veritabanına bağlanılamadı.";
}
?>
Bağlantı başarılı olduğunda ekranda aşağıdaki mesaj görüntülenir:
Veritabanı bağlantısı başarılı.
Bağlantı sırasında PDOException türünde bir hata oluşursa catch bloğu çalışır.
Burada PDOException, PDO işlemleri sırasında oluşabilecek istisnaları temsil eden PHP sınıfıdır.
PDO bağlantısında hataların nasıl yönetileceğini belirlemek için PDO::ATTR_ERRMODE seçeneği kullanılır.
Bu seçenek PDO::ERRMODE_EXCEPTION değeriyle birlikte kullanıldığında veritabanı hataları istisna olarak oluşturulur.
<?php
try {
$db = new PDO(
"mysql:host=localhost;dbname=okul;charset=utf8mb4",
"root",
""
);
$db->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
echo "Bağlantı başarılı.";
} catch (PDOException $hata) {
echo "Veritabanı bağlantı hatası.";
}
?>
Burada setAttribute() metodu PDO bağlantısının bir özelliğini ayarlamak için kullanılmıştır.
PHP 8.0 ve sonraki sürümlerde PDO'nun varsayılan hata modu ERRMODE_EXCEPTION olarak ayarlanmıştır. Ancak farklı sürümlerde de davranışın açıkça belirlenmesi için bu ayarın yazılması yararlıdır.
PDO bağlantısında hata yönetimi dışında farklı ayarlar da kullanılabilir.
Örneğin PDO::ATTR_DEFAULT_FETCH_MODE seçeneği, veritabanından alınan kayıtların varsayılan olarak hangi biçimde döndürüleceğini belirler.
PDO::FETCH_ASSOC değeri, kayıtların sütun adlarıyla erişilebilen ilişkisel diziler şeklinde alınmasını sağlar.
Ayrıca PDO::ATTR_EMULATE_PREPARES seçeneği, hazırlanmış sorguların PDO tarafından taklit edilip edilmeyeceğini belirler.
MySQL sürücüsünde bu seçeneği false olarak ayarlamak, desteklenen sorgularda sunucu taraflı hazırlanmış sorguların kullanılmasını sağlar.
Bu ayarların tamamını bağlantı oluşturulurken de tanımlayabiliriz.
<?php
try {
$db = new PDO(
"mysql:host=localhost;dbname=okul;charset=utf8mb4",
"root",
"",
array(
PDO::ATTR_ERRMODE =>
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE =>
PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES =>
false
)
);
echo "PDO bağlantısı başarılı.";
} catch (PDOException $hata) {
echo "Veritabanına bağlanılamadı.";
}
?>
Bu örnekte PDO bağlantısı oluşturulurken üç farklı ayar tanımlanmıştır.
PDO::FETCH_ASSOC ve hazırlanmış sorguların kullanımını sonraki derslerimizde ayrıntılı olarak inceleyeceğiz.
Bir web uygulamasında birden fazla PHP sayfası aynı veritabanını kullanabilir.
Her sayfada yeniden bağlantı kodu yazmak yerine ortak bir bağlantı dosyası oluşturmak daha düzenli bir yöntemdir.
Örneğin projemizin dosya yapısı aşağıdaki gibi olsun:
php_proje/
│
├── index.php
├── ogrenciler.php
└── db.php
Öncelikle db.php isimli dosyamızı oluşturalım.
<?php
try {
$db = new PDO(
"mysql:host=localhost;dbname=okul;charset=utf8mb4",
"root",
"",
array(
PDO::ATTR_ERRMODE =>
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE =>
PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES =>
false
)
);
} catch (PDOException $hata) {
error_log($hata->getMessage());
die("Veritabanı bağlantısı kurulamadı.");
}
?>
Bu dosyada bağlantı bilgileri ve PDO ayarları tek bir yerde tutulmuştur.
Bağlantı sırasında hata oluşursa error_log() ile hata bilgisi sunucunun hata günlüğüne gönderilir. Kullanıcıya ise yalnızca genel bir hata mesajı gösterilir.
Burada die() fonksiyonu, verilen mesajı görüntüleyerek PHP kodunun çalışmasını sonlandırır.
Önemli: Gerçek projelerde veritabanı kullanıcı adı ve parolası kaynak kod deposuna eklenmemeli, mümkünse ortam değişkenleri veya güvenli yapılandırma dosyaları üzerinden yönetilmelidir.
Önceki derslerimizde öğrendiğimiz require_once ifadesini kullanarak db.php dosyasını diğer PHP sayfalarına dahil edebiliriz.
index.php
<?php
require_once __DIR__ . "/db.php";
echo "Ana sayfa veritabanına bağlandı.";
?>
ogrenciler.php
<?php
require_once __DIR__ . "/db.php";
echo "Öğrenciler sayfası veritabanına bağlandı.";
?>
Bu örnekte her iki sayfa da aynı db.php dosyasını kullanmaktadır.
require_once, dosyanın aynı çalışma sırasında yalnızca bir kez dahil edilmesini sağlar.
Burada kullanılan __DIR__ ifadesi, mevcut PHP dosyasının bulunduğu klasörün tam yolunu verir.
Böylece bağlantı dosyasının yolu daha güvenilir şekilde belirlenir.
PDO ile oluşturulan veritabanı bağlantısı, bağlantı nesnesine ait referanslar kalmadığında serbest bırakılır. Normal PHP isteği sona erdiğinde de bağlantı kaynakları temizlenir.
Bağlantıyı daha erken kapatmak istediğimizde PDO nesnesinin bulunduğu değişkene null değeri atayabiliriz.
<?php
require_once __DIR__ . "/db.php";
echo "Veritabanı bağlantısı kullanıldı.";
$db = null;
?>
Bu işlem, $db değişkeninin PDO nesnesine olan referansını kaldırır. Nesneye başka referans kalmamışsa bağlantı serbest bırakılabilir.
Basit PHP uygulamalarında bağlantıyı her sayfanın sonunda elle kapatmak genellikle gerekli değildir.
Şimdi öğrendiğimiz bilgileri kullanarak beş farklı uygulama gerçekleştirelim.
Bu uygulamada okul veritabanına PDO ile bağlanacağız.
<?php
try {
$db = new PDO(
"mysql:host=localhost;dbname=okul;charset=utf8mb4",
"root",
""
);
echo "Bağlantı başarılı.";
} catch (PDOException $hata) {
echo "Bağlantı başarısız.";
}
?>
Bağlantı başarılıysa ekranda "Bağlantı başarılı." mesajı görüntülenir.
Bu uygulamada var olmayan bir veritabanına bağlanmayı deneyerek hata yönetimini inceleyeceğiz.
<?php
try {
$db = new PDO(
"mysql:host=localhost;dbname=olmayan_veritabani;charset=utf8mb4",
"root",
""
);
echo "Bağlantı başarılı.";
} catch (PDOException $hata) {
echo "Veritabanı bulunamadı veya bağlantı kurulamadı.";
}
?>
Veritabanı mevcut değilse bağlantı sırasında istisna oluşur ve catch bloğu çalışır.
Bu uygulamada PDO bağlantısını hata modu ve veri alma ayarlarıyla oluşturacağız.
<?php
try {
$db = new PDO(
"mysql:host=localhost;dbname=okul;charset=utf8mb4",
"root",
"",
array(
PDO::ATTR_ERRMODE =>
PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE =>
PDO::FETCH_ASSOC
)
);
echo "PDO ayarlarıyla bağlantı oluşturuldu.";
} catch (PDOException $hata) {
echo "Bağlantı kurulamadı.";
}
?>
Bu uygulamada daha önce oluşturduğumuz db.php dosyasını başka bir sayfada kullanacağız.
baglanti_test.php
<?php
require_once __DIR__ . "/db.php";
if ($db instanceof PDO) {
echo "PDO bağlantısı hazır.";
}
?>
Burada instanceof ifadesi, $db değişkeninin PDO sınıfından oluşturulmuş bir nesne olup olmadığını kontrol eder.
Bu uygulamada bağlantı kurduğumuz veritabanının adını SQL sorgusuyla öğreneceğiz.
<?php
require_once __DIR__ . "/db.php";
try {
$sorgu = $db->query("SELECT DATABASE()");
$veritabaniAdi = $sorgu->fetchColumn();
echo "Bağlı Veritabanı: "
. htmlspecialchars(
(string) $veritabaniAdi,
ENT_QUOTES,
"UTF-8"
);
} catch (PDOException $hata) {
echo "Veritabanı bilgisi alınamadı.";
}
?>
Ekran Çıktısı:
Bağlı Veritabanı: okul
Bu örnekte query() metodu kullanılarak MySQL sunucusuna bir SQL sorgusu gönderilmiştir.
SELECT DATABASE() sorgusu, bağlantıda seçili olan veritabanının adını döndürür.
fetchColumn() metodu ise sorgu sonucundaki ilk satırın ilk sütun değerini alır.
SQL sorgularını ve PDO ile veri çekme işlemlerini sonraki derslerimizde ayrıntılı olarak öğreneceğiz.
Uygulama 1: phpMyAdmin kullanarak kutuphane isimli bir veritabanı oluşturunuz. PHP ile PDO bağlantısı kurunuz.
Uygulama 2: PDO bağlantısında veritabanı adını yanlış yazarak oluşan hatayı try-catch ile yakalayınız.
Uygulama 3: PDO::ATTR_ERRMODE ve PDO::ATTR_DEFAULT_FETCH_MODE seçeneklerini kullanarak bağlantı oluşturunuz.
Uygulama 4: Veritabanı bağlantısını db.php isimli ayrı bir dosyada oluşturunuz. require_once kullanarak iki farklı PHP sayfasına dahil ediniz.
Uygulama 5: PDO ile bağlantı kurduğunuz veritabanının adını SELECT DATABASE() sorgusuyla öğrenerek ekrana yazdırınız.
Bu dersimizde PDO'nun ne olduğunu ve PHP ile MySQL veritabanına nasıl bağlantı kurulacağını öğrendik.
Öncelikle veritabanı, MySQL ve PDO kavramlarını inceledik. Ardından phpMyAdmin kullanarak okul isimli bir veritabanı oluşturduk.
new PDO() ifadesiyle MySQL bağlantısı kurduk, bağlantı parametrelerini öğrendik ve try-catch kullanarak oluşabilecek bağlantı hatalarını yönettik.
Ayrıca ortak bir db.php dosyası oluşturarak bağlantı kodunu farklı sayfalarda kullanmayı öğrendik.
PDO, PHP ile veritabanı uygulamaları geliştirmek için kullanılan önemli araçlardan biridir.
Sonraki dersimizde PDO kullanarak MySQL veritabanına yeni kayıt eklemeyi, yani INSERT işlemini öğreneceğiz.
Toplam 50 Makale
Lütfen yorumlarınızda saygılı, yapıcı ve anlaşılır bir dil kullanın.
Küfür, hakaret ya da spam içerikler onaylanmaz.