PDO’nun En Kolay Hali

Genelde, mysql fonksiyonundan PDO’ya geçişte biraz zorlanılır. Bu yazıda, PHP ile veri çekerken ve eklerken en çok kullandığımız yöntemlerin PDO karşılığını yazacağım.

PDO ile MySQL Veritabanına Bağlanmak

$pdo = new PDO('mysql:host=localhost;dbname=veritabani;charset=utf8', 'kullaniciAdi', 'sifre');

Bu satır, mysql_connect() satırıyla aynı işi hatta daha fazlasını yapar. Hem belirttiğimiz veritabanına bağlanır hem de karakter setini belirler. Böylece türkçe karakter sıkıntısı yaşamayız.

PDO ile Veri Listelemek

$sorgu = $pdo->query('SELECT * FROM tablo');
$ogeler = $sorgu->fetchAll();

foreach ($ogeler as $oge) {
	echo $oge['baslik'] . '<br>';
}

Burada, query() ile sorguyu yazdık ve fetchAll() metodu ile verileri birden fazla yani hepsini çekecek biçimde aldık. Daha sonra foreach() ile sayfaya yazdırdık.

PDO ile Veri Çekmek

PHP’de PDO ile veri çekerken veya listelerken iki yöntemimiz var. Bunlardan birincisi query() metodu diğeriyse önce prepare() yani hazırlama metodu sonrasında execute() yani çalıştır metodu. İlk metodun örneğini veri listelemek bölümünde yaptık, şimdi tekil veri çekerken, ikinci yöntemi yani prepare() metodunu kullanacağız.

$id = $_GET['id'];
$sorgu = $pdo->prepare('SELECT * FROM table WHERE id=?');
$calistir = $sorgu->execute(array($id));
$oge = $calistir->fetch();
echo $oge['baslik'];

Neden ilkinden farkı bir yöntem kullandık?

Çünkü, veritabanı ile bilgi alışverişi yaparken güvenliğe önem vermemiz gerekiyor. Son örnekte, kullanıcıdan gelen bilgiye göre ($id = $_GET['id'] satırına dikkat) bilgi çekiyoruz. Önceleri, yani PDO’dan evvel değişkeni sorgu içine ekleyip de veriler çekiliyordu. Ama SQL Injection dediğimiz açıkları da beraberinde getiriyordu. Biz, bu örnekte önce sorguyu hazırladık, şart yerine ? işareti koyduk ve soru işareti gelen yere $sorgu->execute(array($id)); kısmında göründüğü üzere gelecek verinin $id değişkeni olduğunu söyledik.

Bunun gibi ve bundan farklı birçok örnek mevcut ve kullanıma açık. Mesele mantığı kavramak. Ama en basit hali bu hali. Kolay gelsin. Bir dahaki yazıda, PDO ile veri ekleme, silme ve güncelleme konularına değineceğim.

Esen kalın.

SQL’de Sonraki ve Önceki Satırdaki Veriyi Getirmek

Bir gönderi/blog sistemi düşünelim. Hatta WordPress’ten örnekleyebiliriz. Bazı bloglarda, bir gönderiye girdiğimizde sonraki ve önceki gönderiler için bağlantı olduğunu görürüz. Bunlar için ayrı veriler çekmemiz gerekiyor. Örnek verirken bir model dosyasında kod yazıyormuş gibi örnekleyeceğim, SQL kodundan yola çıkarak sizde geliştirebilirsiniz.

SQL’de Gün İçindeki/Bugüne Ait Kayıtları Listelemek

SQL’de gün içindeki kayıtları listelemek için şöyle bir sorgu gerekiyor:

SELECT * FROM kayitlar WHERE DATE(tarih) = CURDATE()

Bu sorgu, o gün içindeki kayıtları listeliyor. Yani bugün ayın 5’i ise, 5’inde girilen kayıtları gösteriyor.

Bir diğer kullanım ise, son bir günlük kayıtları göstermek. Sorguyu inceleyelim:

SELECT * FROM kayitlar WHERE tarih > DATE_SUB(CURDATE(), INTERVAL 1 DAY)

Bu sorguda son bir gün, yani 24 saatlik kayıtları listeliyor. 1 DAY yazan yeri 1 WEEK yaparak bir haftalık kayıtları, 1 MONTH yazarak son bir aylık kayıtları alabiliyoruz.

Slim Framework ve RedBeanPHP’yi Anlamak

Daha önceleri birkaç forum sitesinde Slim Framework’ü anlamak için sorulara rast gelmiştim. Bundan mütevellit Slim ve RedBeanPHP’yi anlamak için basit bir blog betiği yazdım. Slim Framework için rota işlemleri, RedBeanPHP içinse CRUD işlemlerini anlamak için kod satırlarında gerekli açıklamaları yaptım. Blog betiğinin özellikleri;

  • Gönderi (Listele, ekle, düzenle, sil)
  • Kategori (Listele, ekle, düzenle, sil)
  • Ayar (Basit key/value)
  • Yönetici paneli giriş/çıkış

Hızlı Blog

Örnek kod satırları:

/**
 * Blog gönderi sayfası
 * Gönderiyi görüntüler
 * @param int $id
 */
$app->get("/gonderi/:id", function ($id) use ($app)
{
	// $id değişkeni nümerik değilse hata ver
	if (!is_numeric($id)) exit("Hata");

	// Gönderiyi $id'sine göre çekiyoruz
	$gonderi = R::load("gonderi", $id);

	// Gönderi sayfasını yorumluyoruz
	// $gonderi değişkenini tema dosyasına atıyoruz
	$app->render("gonderi.php", 
		["gonderi" => $gonderi,
		"baslik" => $gonderi["baslik"] ]);
});

Herhangi bir konuda sorularınızı bu sayfadan yorum yaparak veya e-posta ile iletişime geçerek iletebilirsiniz. Kolay gelsin.

Github bağlantısı
HizliBlog Dosyaları (zip)

MySQL’den Gelen Zamanı Dönüştürmek

MySQL’de ayarladığımız datetime/timestamp veri tipli alanlarından gelen tarih verisini ekrana dökmek istediğimizde 2014-11-19 17:16:25 gibi farklı bir tarih-zaman biçimiyle karşılaşıyoruz. Bunu düzgün bir hale getirmek için PHP’de strtotime() fonksiyonunu kullanabiliriz. Şöyle bir ek fonksiyon kullanırsak, işimizi daha rahat görmüş oluruz:

<?php
function mysqlTarihCevir ($tarihzaman, $duzen = null) {
    $tarihzaman = strtotime($tarihzaman);
    if ($duzen) {
        return date($duzen, $tarihzaman);
    } else {
        return date("d F Y l", $tarihzaman);
    }
}

Yukarıdaki fonksiyonda gelen tarihi otomatikmen d F Y l şeklinde biçimlendiriyoruz ve fonksiyonu mysqlTarihCevir("2014-11-19 17:16:25") olarak çalıştırdığımızda sonuç olarak “19 Kasım 2014 Çarşamba” çıktısını alıyoruz. Tarih biçimlendirme hakkında daha fazla bilgi almak için buradaki manuel sayfasına bakabilirsiniz. Farklı şekilde kullanmak içinse şöyle yapabiliriz: mysqlTarihCevir("2014-11-19 17:16:25", "d-m-Y") böylelikle çıktı “19-11-2014” olacaktır.

RedBeanPHP CRUD (Ekleme, Okuma, Güncelleme, Silme) İşlemleri

Slim Framework ve Veritabanı İşlemleri yazısında RedBeanPHP’den bahsetmiştik. Bu sefer CRUD işlemleri nasıl bir basitlikle yapılıyor, ondan bahsedeceğim.

Evvela veritabanı bağlantısını yapıyoruz:

require "rb.php";
R::setup('mysql:host=localhost;dbname=veritabaniadi', 'kullaniciadi','sifre');

Veri Ekleme (Create)

Kitaplar hakkında bir tablomuzun olduğunu varsayıyorum:

$kitap = R::dispense("kitap"); // Tabloyu 'kitap' olarak seçtik
$kitap->baslik = "Gelecekteki İlkel"; // Sütun adını belirleyip değer atadık
$kitap->yazar = "John Zerzan";
$kitap->fiyat = 25.00;

$id = R::store($kitap); // Store ile ekleyip last_insert_id'sini alıyoruz

Veri Okuma (Read)

$kitap = R::load("kitap", 5); // ID'si 5 olan kitabı seçtik
echo $kitap->baslik; // Kitaba ait başlığı yazdırdık.

Veri Güncelleme (Update)

$kitap = R::load("kitap", 5); // ID'si 5 olan kitabı seçtik
$kitap->baslik = "Yeni kitap başlığı"; // Yeni değerler atıyoruz
$kitap->yazar = "Yeni kitap yazarı"; 
$kitap->fiyat = 20.00;
R::store($kitap); // Değerleri veritabanına yazıyoruz

Veri Silme (Delete)

$kitap = R::load("kitap", 5);
R::trash($kitap); // ID'si 5 olan kitabı siliyoruz

Olan biten bu şekilde. Açıklamaları satırlarda yaptım, yapmasam bile anlaşılabilir zaten. Az kod yazarak çok işlem yapılabiliyor. Görüşmek üzere.

Many to Many İlişki Tipi

Veritabanında birden fazla veriyi birden fazla veriye ilişkilendirmek için Many To Many Relationship diye bir yöntem var. Türkçe manası da herhale Çoktan çoğa ilişki tipidir. Bu yönteme bir blog sisteminde ihtiyaç duydum. Bir blog gönderisine bir kategori tanımlamak daha önceden yaptığım bir işti. Ama Bir gönderiye birden fazla kategori tanımlamak istediğimde bu tarz bi yönteme başvurmak gerektiğini öğrendim.

Bir gonderi tablomuz olsun, içerisinde id, baslik, govde alanları olduğunu varsayalım. Bir de kategori tablomuz olsun, içindeki alanlarsa id, adi, aciklama olsun.

Bu noktada her şey tamam. Şimdi yapmamız gereken bu iki tablodaki verileri ilişkilendirmek olacak. Önceden gönderiyi bir kategoriyle ilişkilendirmek için gönderi tablosunda kategori_id adlı bir alan oluşturup gönderinin ait olduğu kategorinin ID’sini eklerdik. Ama birden fazla kategori tanımlamak istenildiğinde bu durum yapılamıyordu. Şimdi, bu durumun üstesinden gelebilmek için hangi gönderi ve kategorilerin hangisiyle ilişkili olduğunu tutabileceğimiz bir tablo oluşturacağız. Tablonun adı gonderi_kategori olsun. İçerisindeki alanlar ise id, gonderi_id, kategori_id olsun. Görsel olarak şöyle:

Gönderi Kategori İlişki

1 numaralı gönderi, 2 ve 3 numaralı kategoriyle ilişkilendirildiğinde, gonderi_kategori tablosuna iki satır eklenir. Yani şöyle:

id gonderi_id kategori_id
1 1 2
2 1 3

Daha sonra uygulamalı bir örnekte görüşmek üzere diyelim.