ile

PHP ile içerik yönetim sistemi – 5 Gereksiz kod tekrarlarından kaçınmak ve hataları başından önlemek

siyahbeyaz

Kalan iki sınıfımız daha var. Kategoriler ve Resimler. Bir önceki bölümde hazırladığımız gibi, diğer iki sınıf dosyasını da hazırlayalım:

Kategoriler sınıfı:

[code language=”php”]
<?php
/**
* Tüm sistemdeki kategorileri yönetecek olan kategori sınıfıdır.
*
* Sistemdeki kategorilerin düzenlenmesini, silinmesini, görüntülenmesini,
* listelenmesini ve eklenmesini kontrol eden sınıftır.
*
* @author Midori Kocak <mtkocak@mtkocak.net>
*/
class Categories{

/**
* Kategorinin tekil id’sini tutan değişken. Başka kategorilerle karışmamasını sağlar
*
* @var int
*/
public $id;

/**
* Kategori başlığı
*
* @var string
*/
public $title;

/**
* Veritabanı bağlantısını tutacak olan değişken.
*
* @var PDO
*/
private $db;

/**
* Veritabanına bağlanmaya yarayan yardımcı metod
*
* @param string host Veritabanı sunucusunun adresi
* @param string dbname Veritabanı adı
* @param string username Kullanıcı adı
* @param string password Parola
* @return string bağlanılabildiyse doğru, bağlanamadıysa hata mesajı döndürsün.
*/
public function connect($host, $username, $password, $dbname){
try {
return $this->db = new PDO("mysql:host=".$host.";dbname=".$dbname."", "".$username."", "".$password."", array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
} catch ( PDOException $e ){
return $e->getMessage();
}
}

/**
* Kategori ekleyen metod, verilerin kaydedilmesini sağlar.
*
* @param string $title Kategori başlığı
* @param string $content Kategori içeriği
* @param int $category_id Kategori kategorisinin benzersiz kimliği
* @return bool eklendiyse doğru, eklenemediyse yanlış değer döndürsün
*/
public function add($title){

// Önce veritabanı sorgumuzu hazırlayalım.
$query = $this->db->prepare("INSERT INTO categories SET title=:baslik");

$insert = $query->execute(array(
"baslik"=>$title
));

if($insert){
// Veritabanı işlemi başarılı ise sınıfın objesine ait değişkenleri değiştirelim
$this->id = $this->db->lastInsertId();
$this->title = $title;

return true;
}
else{
return false;
}
}

/**
* Tek bir kategorinin gösterilmesini sağlayan method
*
* @param int $id Kategorinin benzersiz index’i
* @return array gösterilebildyise dizi türünde verileri döndürsün, gösterilemediyse false, yanlış değeri döndürsün
*/
public function view($id){

// Eğer daha önceden sorgu işlemi yapıldıysa, sınıf objesine yazılmıştır.
if($id == $this->id){
return array("id"=>$this->id,"title"=>$this->title);
}
else{
// Buradan anlıyoruz ki veri henüz çekilmemiş. Veriyi çekmeye başlayalım
$query = $this->db->prepare("SELECT * FROM posts WHERE id=:id");
$query->execute(array(‘:id’=>$id));

if($query){
$result = $query->fetch(PDO::FETCH_ASSOC);

$this->id = $result[‘id’];
$this->title = $result[‘title’];

return $result;
}
}

// Eğer iki işlem de başarısız olduysa, false, yanlış değer döndürelim.
return false;
}

/**
* Tüm kategorilerin listelenmesini sağlayan metod.
*
* @return bool listelenebildiyse doğru, listelenemediyse yanlış değer döndürsün
*/
public function index(){
$query = $this->db->prepare("SELECT * FROM categories");
$query->execute();
if($query){
// Buradaki fetchAll metoduyla tüm değeleri diziye çektik.
return $query->fetchAll(PDO::FETCH_ASSOC);
}
else
{
return false;
}
}

/**
* Kategori düzenleyen metod. Verilen Id bilginse göre, alınan bilgi ile sistemdeki bilgiyi değiştiren
* güncelleyen metod.
*
* @param int $id Kategorinin benzersiz index’i
* @return bool düzenlendiyse doğru, eklenemediyse yanlış değer döndürsün
*/
public function edit($id, $title){

// Önce veritabanı sorgumuzu hazırlayalım.
$query = $this->db->prepare("UPDATE categories SET title=:baslik WHERE id=:id");

$update = $query->execute(array(
"baslik"=>$title,
"id"=>$id
));

if ( $update ){
return true;
}
else
{
return false;
}
}

/**
* Kategori silen metod, verilerin silinmesini sağlar.
* Geri dönüşü yoktur.
*
* @param int $id Kategorinin benzersiz index’i
* @return bool silindiyse doğru, eklenemediyse yanlış değer döndürsün
*/
public function delete($id){
$query = $this->db->prepare("DELETE FROM categories WHERE id = :id");
$delete = $query->execute(array(
‘id’ => $id
));
}

}
?>

[/code]

Dosyalar sınıfı:

[code language=”php”]
<?php
/**
* Tüm sistemdeki dosyaları yönetecek olan dosya sınıfıdır.
*
* Sistemdeki dosyaların düzenlenmesini, silinmesini, görüntülenmesini,
* listelenmesini ve eklenmesini kontrol eden sınıftır.
*
* @author Midori Kocak <mtkocak@mtkocak.net>
*/
class Files{

/**
* Dosyanın tekil id’sini tutan değişken. Başka dosyalarle karışmamasını sağlar
*
* @var int
*/
public $id;

/**
* Dosya ismi
*
* @var string
*/
public $filename;

/**
* Veritabanı bağlantısını tutacak olan değişken.
*
* @var PDO
*/
private $db;

/**
* Veritabanına bağlanmaya yarayan yardımcı metod
*
* @param string host Veritabanı sunucusunun adresi
* @param string dbname Veritabanı adı
* @param string username Kullanıcı adı
* @param string password Parola
* @return string bağlanılabildiyse doğru, bağlanamadıysa hata mesajı döndürsün.
*/
public function connect($host, $username, $password, $dbname){
try {
return $this->db = new PDO("mysql:host=".$host.";dbname=".$dbname."", "".$username."", "".$password."", array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
} catch ( PDOException $e ){
return $e->getMessage();
}
}

/**
* Dosya ekleyen metod, verilerin kaydedilmesini sağlar.
*
* @param string $title Dosya başlığı
* @param string $content Dosya içeriği
* @param int $category_id Dosya kategorisinin benzersiz kimliği
* @return bool eklendiyse doğru, eklenemediyse yanlış değer döndürsün
*/
public function add($filename){

// Önce veritabanı sorgumuzu hazırlayalım.
$query = $this->db->prepare("INSERT INTO posts SET filename=:dosyaadi");

$insert = $query->execute(array(
"dosyaadi"=>$filename,
));

if($insert){
// Veritabanı işlemi başarılı ise sınıfın objesine ait değişkenleri değiştirelim
$this->id = $this->db->lastInsertId();
$this->filename = $filename;

return true;
}
else{
return false;
}
}

/**
* Tek bir dosyanın gösterilmesini sağlayan method
*
* @param int $id Dosyanın benzersiz index’i
* @return array gösterilebildyise dizi türünde verileri döndürsün, gösterilemediyse false, yanlış değeri döndürsün
*/
public function view($id){

// Eğer daha önceden sorgu işlemi yapıldıysa, sınıf objesine yazılmıştır.
if($id == $this->id){
return array("id"=>$this->id,"filename"=>$this->filename);
}
else{
// Buradan anlıyoruz ki veri henüz çekilmemiş. Veriyi çekmeye başlayalım
$query = $this->db->prepare("SELECT * FROM files WHERE id=:id");
$query->execute(array(‘:id’=>$id));

if($query){
$result = $query->fetch(PDO::FETCH_ASSOC);

$this->id = $result[‘id’];
$this->title = $result[‘filename’];

return $result;
}
}

// Eğer iki işlem de başarısız olduysa, false, yanlış değer döndürelim.
return false;
}

/**
* Tüm dosyaların listelenmesini sağlayan metod.
*
* @return bool listelenebildiyse doğru, listelenemediyse yanlış değer döndürsün
*/
public function index(){
$query = $this->db->prepare("SELECT * FROM files");
$query->execute();
if($query){
// Buradaki fetchAll metoduyla tüm değeleri diziye çektik.
return $query->fetchAll(PDO::FETCH_ASSOC);
}
else
{
return false;
}
}

/**
* Dosya düzenleyen metod. Verilen Id bilginse göre, alınan bilgi ile sistemdeki bilgiyi değiştiren
* güncelleyen metod.
*
* @param int $id Dosyanın benzersiz index’i
* @return bool düzenlendiyse doğru, eklenemediyse yanlış değer döndürsün
*/
public function edit($id, $filename){

// Tarih içeren alanları elle girmiyoruz. Sistemden doğrudan isteyen fonksiyonumuz var.
$date = $this->getDate();

// Önce veritabanı sorgumuzu hazırlayalım.
$query = $this->db->prepare("UPDATE files SET filename=:filename WHERE id=:id");

$update = $query->execute(array(
"filename"=>$filename,
));

if ( $update ){
return true;
}
else
{
return false;
}
}

/**
* Dosya silen metod, verilerin silinmesini sağlar.
* Geri dönüşü yoktur.
*
* @param int $id Dosyanın benzersiz index’i
* @return bool silindiyse doğru, eklenemediyse yanlış değer döndürsün
*/
public function delete($id){
$query = $this->db->prepare("DELETE FROM files WHERE id = :id");
$delete = $query->execute(array(
‘id’ => $id
));
}

}
?>
[/code]

Şimdilik burada dosya ve dizin işlemlerini kodun içine yerleştirmedim.

Bir şey dikkatinizi çekti mi? Üç sınıfta da kodlar neredeyse aynı. Bir sürü tekrar var. Kendimizi tekrar etmememiz gerekiyor. Bir şey eğer çok kullanılıyorsa, bunu gruplayıp, ihtiyacımız olduğu zaman kullanmalıyız. Bunu şimdilik sonraya bırakalım.

Projeyi ne de olsa çalışıyor diye bu şekilde bırakırsanız, hapı yutmanız mümkündür. Neden mi? Çünkü, her sınıfın içinde ayrı bir veritabanı bağlantısı fonksiyonu var. Bu kesinlikle olmaması gereken bişey. Bu şekilde hangi sınıfın hangi veritabanına bağlandığını kontrol edemeyiz.

Bunlardan farklı olarak, her sınıfta veritabanı nesnesini yeniden oluşturuyoruz. Eğer veritabanı sınıfı bozuksa, bu sınıfımızın çalışmasını öldürecektir. Bunun yerine nesneyi farklı bir yerden sınıfa dahil etmek daha doğru olacak.

Ayrıca farklı bir veritabanı kullanmak istediğimizi farzedelim. Binlerce satır kodu nasıl değiştireceğiz? Bu yüzden sınıflar içerisinde SQL kodu kullanmak gerçekten mide bulandırıcı. Yine de şimdilik SQL kodları orda kalsın.

En çok kullandığımz kod, veritabanına bağlanmak için kullandığımız.

[code language=”php”]
/**
* Veritabanı bağlantısını tutacak olan değişken.
*
* @var PDO
*/
private $db;

/**
* Veritabanına bağlanmaya yarayan yardımcı metod
*
* @param string host Veritabanı sunucusunun adresi
* @param string dbname Veritabanı adı
* @param string username Kullanıcı adı
* @param string password Parola
* @return string bağlanılabildiyse doğru, bağlanamadıysa hata mesajı döndürsün.
*/
public function connect($host, $username, $password, $dbname){
try {
return $this->db = new PDO("mysql:host=".$host.";dbname=".$dbname."", "".$username."", "".$password."", array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
} catch ( PDOException $e ){
return $e->getMessage();
}
}
[/code]

Bu kod tüm sınıflarda aynı. Bu sınıfı kodlarımızdan silelim ve ayrı bir sınıf yaratalım. Ancak tüm diğer sınıflarımızda bu yeni bağlantı sınıfını kullanalım.

[code language=”php”]
<?php
/**
* Uygulamamızı çalıştıracak olan sınıf
*
* Sistemdeki tüm sınıfların içermeleri gereken veritabanı ve diğer bilgileri tutan sınıf.
*
* @author Midori Kocak <mtkocak@mtkocak.net>
*/

namespace Midori\Cms;

class App{

/**
* Veritabanı bağlantısını tutacak olan değişken.
*
* @var PDO
*/
private $db = false;

/**
* Veritabanına bağlanmaya yarayan kurucu metod
*
* @param string host Veritabanı sunucusunun adresi
* @param string dbname Veritabanı adı
* @param string username Kullanıcı adı
* @param string password Parola
* @return string bağlanılabildiyse doğru, bağlanamadıysa hata mesajı döndürsün.
*/
public function __construct($host, $username, $password, $dbname){
try {
return $this->db = new PDO("mysql:host=".$host.";dbname=".$dbname."", "".$username."", "".$password."", array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
} catch ( PDOException $e ){
return $e->getMessage();
}
}
}
?>
[/code]

Bu bağlantı sınıfımızı oluşturduk. Tek veritabanı bağlantımızı bu sınıftan çağıracağız. __construct() kısmına dikkat ettiniz mi? “__” ifadesi ile bağlayan metodlar sihirli metodlardır. __consturct() ifadesi, sınıftan yeni bir metod yaratıldığına otomatik olarak çalışan metodlardır. Bunu anlattım ama bunu kullanmayacağız. Çünkü her programı çalıştırdığımızda bu ayarları tek tek girmemiz saçma olur. Bunun yerine temel bir program sınıfı yaratacağız. Bütün gereklilikleri alsın, ayarları belirlesin ve programı kullanımımıza hazır hale getirsin. Bunu da bir sonraki yazıda yapacağız.

Yorumla

Yorum