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.

PHP’de PDO Veritabanı İşlemleri Sınıfı

Çok kullandığım veritabanı işlemleri için bir sınıf yazdım. Bu PHP sınıfı sayesinde veri çekme, listeleme, ekleme, güncelleme ve silme işlemlerini hızlıca alabiliyorum. Kodları aşağıda paylaştıktan sonra nasıl kullanıldığına dair bilgiler vereceğim.

<?php
/**
 * Hızlı Veritabanı İşlemleri
 * @author Yılmaz Demir
 * @link http://yilmazdemir.com.tr
 * @version 0.1
 */

class Database extends PDO {
	/**
	 * Veritabanı bilgilerine ait sabitler
	 * Kendinize göre düzenleyebilirsiniz
	 */
	const DB_HOST = "localhost";
	const DB_NAME = "veritabaniadi";
	const DB_USER = "kullaniciadi";
	const DB_PASS = "sifre";

	// Tablodaki asıl anahtar (Primary key)
	const PK = "id";

	public $query;

	/**
	 * Başlatıcı
	 * PDO veritabanı bağlantısı kurar
	 * Karakter setini UTF-8 olarak belirler
	 * Olası hatada çalışmayı durdurur
	 */
	public function __construct()
	{
		try {
			parent::__construct(
				"mysql:host=" . 
				self::DB_HOST . 
				";dbname=" . 
				self::DB_NAME, 
				self::DB_USER, 
				self::DB_PASS,
				array(
					PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
					PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8"
					)
				);
		} catch (PDOException $e) {
			exit($e->getMessage());
		}
	}

	/**
	 * Tablo adına ve koşullara göre tek satır veri döndürür
	 * @param string $table Tablo adı
	 * @param string $conditions Şartlar (WHERE id=? gibi)
	 * @param array $parameters Parametreler (array(1) gibi)
	 * @return object Obje şeklinde döndürür ($post->title gibi)
	 */
	public function getOne($table, $conditions = null, $parameters = [])
	{
		$this->query = $this->prepare("SELECT * FROM " . $table . " " . $conditions);
		$this->query->execute($parameters);
		return $this->query->fetch(PDO::FETCH_OBJ);	
	}

	/**
	 * Tablo adına ve koşullara göre çoklu veri döndürür
	 * @param string $table Tablo adı
	 * @param string $conditions Şartlar (type=? gibi)
	 * @param array $parameters Parametreler (array("post") gibi)
	 * @return object Obje şeklinde döndürür ($post->title gibi)
	 */
	public function getAll($table, $conditions = null, $parameters = [])
	{
		$this->query = $this->prepare("SELECT * FROM " . $table . " " . $conditions);
		$this->query->execute($parameters);
		return $this->query->fetchAll(PDO::FETCH_OBJ);
	}

	/**
	 * Tabloya yeni veri eklemek için kullanılır
	 * @param string $table Tablo adı
	 * @param array $data Dizi şeklinde sütun adları
	 * ve karşılarında veriler olmak üzere
	 * @return int Son eklenen verinin ID'sini döndürür
	 */
	public function insert($table, $data)
	{
		$values = array();
		$columns = array();
		foreach ($data as $column => $value) {
			$values[] = $value;
			$columns[] = $column;
		}

		$columns = implode(",", $columns);
		$marks = trim(substr(str_repeat("?,", count($values)), 0, -1));

		$this->query = $this->prepare("INSERT INTO " . $table . " (" . $columns . ") VALUES (" . $marks . ")");
		if ($this->query->execute($values)) {
			return $this->lastInsertId();
		}
		return false;
	}

	/**
	 * Tablodaki veriyi güncellemek için kullanılır
	 * @param string $table Tablo adı
	 * @param int $id Güncellenecek verinin ID'si
	 * @param array $data Dizi şeklinde sütun adları
	 * ve karşılarında veriler olmak üzere
	 * @return int Güncellenen verinin ID'sini ya da false döndürür
	 */
	public function update($table, $id, $data)
	{
		$values = array();
		$columns = array();
		foreach ($data as $column => $value) {
			$values[] = $value;
			$columns[] = $column;
		}

		$columnsAndMarks = implode("=?,", $columns) . "=?";

		$this->query = $this->prepare("UPDATE " . $table . " SET " . $columnsAndMarks ." WHERE " . self::PK . "=" . $id);
		if ($this->query->execute($values)) {
			return $id;
		}
		return false;
	}

	/**
	 * Tablodaki veriyi silmek/kaldırmak için kullanılır
	 * @param string $table Tablo adı
	 * @param int $id Silinecek verinin ID'si
	 * @return int Silinen verinin ID'sini ya da false döndürür
	 */
	public function delete($table, $id)
	{
		$this->query = $this->prepare("DELETE FROM " . $table . " WHERE " . self::PK . "=" . $id);
		if ($this->query->execute()) {
			return $id;
		}
		return false;
	}

	/**
	 * Tablo adına ve koşullara göre satır sayısını döndürür
	 * @param string $table Tablo adı
	 * @param string $conditions Şartlar (WHERE type=? gibi)
	 * @param array $parameters Parametreler (array("post") gibi)
	 * @return int Kaç satır veri olduğunu döndürür
	 */
	public function count($table, $conditions = null, $parameters = [])
	{
		$this->query = $this->prepare("SELECT * FROM " . $table . " " . $conditions);
		$this->query->execute($parameters);
		return $this->query->rowCount();
	}
}

Sınıfın kullanımı

Veri çekme

Sınıf içerisindeki getOne() methodu ile tek satırlık veri çekiyoruz. Kullanımı:

$db = new Database;
$gonderi = $db->getOne("gonderi", "WHERE id=?", array(5));
echo $gonderi->baslik;

Veri Listeleme

getAll() methodu ile bütün gönderileri çekebiliyoruz. Parametrelerle şartlar belirlenebiliyor.

$db = new Database;
$gonderiler = $db->getAll("gonderi", "WHERE taslak=?", array(0));
foreach ($gonderiler as $gonderi) {
	echo $gonderi->baslik . "<br/>";
}

Veri Ekleme

insert() methodu ile veri ekleyebiliyoruz.

$db = new Database;
$id = $db->insert("gonderi", array(
	"baslik" => "Gönderi Başlığı",
	"icerik" => "<p>Gönderi İçeriği</p>",
	"taslak" => 1
	)
);

echo $id ? $id . " ID'li gönderi eklendi." : "Gönderi eklenemedi";

Veri Güncelleme

update() methodu ile veri güncelleyebiliyoruz. İkinci parametre düzenlenecek gönderinin ID’sini alıyor.

$id = 5;
$db = new Database;
$guncelle = $db->update("gonderi", $id, array(
		"baslik" => "Güncellenen başlık",
		"icerik" => "<p>Güncellenen içerik</p>",
		"taslak" => 0
	)
);

echo $guncelle ? "Gönderi başarıyla güncellendi" : "Güncelleme başarısız";

Veri Silme

Verileri silmek için delete() methodundan faydalanabiliriz.

$id = 5;
$db = new Database;
$sil = $db->delete("gonderi", $id);
echo $sil ? "Gönderi silindi" : "Silme başarısız";

 Toplam Sayısı Alma

Toplam satır sayısı için count() methodunu kullanabiliriz. Parametre de eklenebiliyor.

$db = new Database;
$sayi = $db->count("gonderi");
echo "Toplamda " . $sayi . " adet gönderi bulunuyor";

Ek olarak, dikkat edilmesi gereken diğer bir nokta sınıf içerisindeki PK sabitini belirlemek gerekiyor. Ben asıl anahtar (primary key) olarak id adını kullanıyorum. Farklı bir isim kullanılıyorsa örn. tblId ise, bu şekilde değiştirilmesi gerekiyor.

Kolay gelsin.

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)

RedBeanPHP ile Etiket Sistemi

RedBeanPHP ile herhangi bir tablo için etiket sistemi yapmak istersek, ORM’nin içinde gelen birkaç özellikle beraber yapabiliyoruz. Örneğin, bir blog için gönderi tablomuz olsun. Gönderi tablosunda her gönderi için birden fazla etiket tanımlamak isteyelim. Şöyle örnekleyeyim;

<?php
$post = R::load("post", 5); // 5 numaralı gönderiyi seçiyorum
R::tag($post, ["etiket 1", "etiket 2", "etiket 3"]); // Gönderiye etiketleri tanımlıyorum

Çok basit birkaç işlem göründüğü üzere. Peki bu kodlar ne yapıyor? Veritabanında tag ve post_tag olmak üzere iki tane tablo oluşturuyor. tag tablosuna id, title olmak üzere iki tane sütun, post_tag tablosuna ise id, post_id, tag_id olmak üzere üç tane sütun oluşturuyor ve post tablosu ile ilişkilendiriyor. Bu ilişkilendirmeye Many to Many İlişki Tipi yazısında bahsetmiştim.

Bir gönderiye ait etiketleri listelemek istersek, aşağıdaki kodları yazıyoruz;

<?php
$post = R::load("post", 5); // 5 ID'li gönderiyi seçelim
$etiketler = R::tags($post); // Etiket listesini değişkene atıyorum
foreach ($etiketler as $etiket) { // Ve listeliyorum
    echo $etiket . ",";
}

Daha detaylı kullanımına ve diğer özelliklere şuradaki sayfadan göz atabilirsiniz.

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.

Slim Framework ve Veritabanı İşlemleri

Bilenler bilir, Slim Framework adlı bir PHP mikro framework (çatı) var. Slim’i detaylandırmadan veritabanı işlemlerini nasıl gerçekleştirdiğimden bahsedeceğim.

Veritabanı işlemlerini yapmak için RedBeanPHP adlı bir ORM (İlişkisel Nesne Eşleştiricisi diye türkçeleştirilebilir) kullanıyorum. İndirmek için composer vb. bir araç kullanmayacağım. Slim’i indirip, aynı klasörün içerisine RedBeanPHP dosyasını atacağım. Hepsini yaptığımızı varsayarak basit bir giriş yapıyorum:

<?php
require "Slim/Slim.php";
require "Slim/rb.php"; // RedBeanPHP dosyasını dahil ediyorum

\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
$app->get("/listele", function () use ($app) { // "listele" rotasını belirliyorum
    $gonderiler = R::findAll("gonderilertablosu"); // Bütün gönderileri findAll ile çekiyorum
    foreach ($gonderiler as $gonderi) { // Sonra listeliyorum
        echo "<h1>{$gonderi->baslik}</h1>";
    }
});
$app->run();

Her şey oldukça basit göründüğü üzere. Daha fazla veritabanı işlemi için RedBeanPHP sitesine bakabilirsiniz.