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.