Büyük ihtimal forumda bu konu vardır dedim fakat yokmuş. :)
Neden OOP?
- OOP yani nesne yönelimli(tabanlı) programlama ile kendinize has bir kodlama biçimi üretebilirsiniz.
- Tekrardan düzenlemeniz veya geliştirmeniz gerekirse bu işlemi daha kolay yaparsınız.
- Hızlıdır ve kod yığınını ortadan kaldırır. Örnek vermek gerekirse php ve mysql ile çalışırken sık sık mysql açmak, kapatmak, değeri almak, sorgulamak, yazdırmak gibi sıkıcı bir sürü işle uğraşırız. Diğer profesyonel dillerde olduğu gibi sadece bir class(sınıf) hazırlarız ve her şeyi onun üzerinden hallederiz.
Bizim İçin Önemli Olan Hız
Birazdan 2 adet dosya oluşturacağız. Bunların birisi bir çok kodlarla dolu olan sınıf(class) dosyası diğeri de projelerimizde kullanacağımız az satırlı kodlarımızın olduğu dosya olacaktır. Amacımız kod yığınımızı en kaliteli ve az komut isteyen bir şekle dönüştürmek.
Başlayalım
Öncelikle her projemizde bir fonksiyon.php bulunmalıdır. Bu fonksiyon.php'yi açalım ve aşağıdaki autoload(otomatik yükleme) fonksiyonunu girelim.
function __autoload($sinif)
{
if(file_exists("sinif/".$sinif.".php"))
{
include("sinif/".$sinif.".php");
}
else
{
echo("Dosya Bulunamadı! : sinif/".$sinif.".php");
}
}
Yazımızın başında da belirttiğimiz gibi bizim için gerekli olan az kodlama. __autoload fonksiyonu ile gerekli sınıfı include yapmamıza gerek kalmadan sadece $s = new s(); gibi komutla çağırmak olacaktır.
Not : sınıf adında bir klasör oluşturmayı unutmayın! Bu yazıda oluşturacağımız mysql sınıfını bu dosyada bulunacak.
En can alıcı noktaya geliyoruz. Oluşturduğumuz sınıf klasörüne sinif.mysql.php adında bir dosya açın. Ve sınıfımızı yazmaya başlayalım.
class mysql
{
}
?>
MySQL işlemlerinde kullanacağımız önemli 3 değişken var fakat bu değişkenler sadece class(sınıf) içerisinde değiştirilmeli. Aksi takdirde güvenlik sorunu yaratacaktır. Bunun için class(sınıf) içerisine şu değişkenleri girelim.
private $dbadi = "";
private $sonuc = array();
private $baglandi = false;
Konumuz MySQL olduğu için işlemleri yapmamızı sağlayacak bir bağlantıya ihtiyacımız var. PHP 6 ile gelen __construct metodu ile sınıf çağrıldığı anda bağlantıyı sağlayacağız. Bu sayede yine hızdan yararlanmış olacağız.
public function __construct($dbhost,$dbkul,$dbsifre,$dbadi)
{
}
Farkedebileceğiniz gibi 4 adet argument kullandık. Bunlar projelerde kullanırken bize gerekli olacak 4 değişken. MySQL bilgileri. Daha bağlantıyı tamamlamadık. Şu komutlarla bağlantıyı tamamlayalım.
if(!$this->baglandi)
{
$baglanti = @mysql_connect($dbhost,$dbkul,$dbsifre);
if($baglanti)
{
$veritabani = @mysql_select_db($dbadi,$baglanti);
if($veritabani)
{
$this->baglandi = true;
$this->dbadi = $dbadi;
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return true;
}
Üstteki kodu sözel olarak kısaca ifade etmek gerekirse. "Eğer daha önce mysql'e bağlanmadıysak kullanıcı tarafından gelen verilerle bağlan"
Bir de yine zamandan ve hızdan tasarruf etmek için __destruct metodu ile işimiz bitince mysql'i kapatalım boşuna yorulmasın :)
public function __destruct()
{
if($this->baglandi)
{
if(@mysql_close())
{
$this->baglandi = false;
return true;
}
else
{
return false;
}
}
}
Bildiğiniz üzere PHP yukarıdan aşağıya doğru okumaktadır. Bu yüzden aşağıdaki fonksiyonu girelim. 'Bu fonksiyon ne :confused:' diye sormayın. Dediğim gibi biraz aşağılarda değineceğiz.
private function tablokontrol($tablo)
{
$tablolar = @mysql_query("SHOW TABLES FROM ".$this->dbadi." LIKE '".$tablo."'");
if($tablolar)
{
if(@mysql_num_rows($tablolar)==1)
{
return true;
}
}
else
{
return false;
}
}
İlk MySQL işlemi olarak ' SELECT ' seçtim. Hemen fonksiyonunu yazalım.
public function sec($tablo, $satirlar = '*', $nerede = NULL, $sirala = NULL)
{
$sorgu = "SELECT ".$satirlar." FROM ".$tablo;
if($nerede != NULL)
{
$sorgu .= " WHERE ".$nerede;
}
if($sirala != NULL)
{
$sorgu .= " ORDER BY ".$sirala;
}
if($this->tablokontrol($tablo))
{
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
$this->sonucsayisi = @mysql_num_rows($sorgula);
for($i = 0; $i < $this->sonucsayisi; $i++)
{
$array = @mysql_fetch_array($sorgula);
$anahtar = array_keys($array);
for($a = 0; $a < count($anahtar); $a++)
{
if(!is_int($anahtar[$a]))
{
if(@mysql_num_rows($sorgula) > 1)
{
$this->sonuc[$i][$anahtar[$a]] = $array[$anahtar[$a]];
}
elseif(@mysql_num_rows($sorgula) < 1)
{
$this->sonuc = NULL;
}
else
{
$this->sonuc[$anahtar[$a]] = $array[$anahtar[$a]];
}
}
}
}
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
Burada zorunlu olarak $tablo değişkenini istedik. Ayrıca isteğe bağlı 3 değişkenimiz var. Fark ettiğiniz gibi bir üstte belirttiğim tablokontrol fonksiyonunu belirttik. Yani sorgulama yapmadan önce tablonun varlığını kontrol etmek için yazmıştık. Sonuçta kullanıcıya güven olmaz yanlış tablo ismi yazabilir :D
Bir sonraki işlemimiz ' INSERT ' yani ekleme yapma. Onun da fonksiyonu altta.
public function ekle($tablo,$degerler,$satirlar = NULL)
{
if($this->tablokontrol($tablo))
{
$sorgu = "INSERT INTO ".$tablo;
if($satirlar != NULL)
{
$sorgu .= " (".$satirlar.") ";
}
for($x = 0;$x < count($degerler); $x++)
{
if(is_string($degerler[$x]))
{
$degerler[$x] = "'".$degerler[$x]."'";
}
}
$degerler = implode(',',$degerler);
$sorgu .= " VALUES (".$degerler.") ";
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
Burada da 2 mutlak değişkenimiz bulunuyor. Yine tablo kontrolü yapıyor ve kullanıcının girdiği değer kadar yükleme yapıyoruz. Bütün işlem bir SQL komutu oluşturmaktan ibaret aslında.
Bir sonraki fonksiyonumuz ' DELETE ' veri silme.
public function sil($tablo, $nerede = NULL)
{
if($this->tablokontrol($tablo))
{
$sorgu = "DELETE FROM ".$tablo;
if($nerede != NULL)
{
$sorgu .= " WHERE ".$nerede;
}
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
Burada da yine tablo kontrolü ve SQL komutu oluşturduk.
Bir diğer önemli fonksiyonumuz ' UPDATE ' yani yenile
public function yenile($tablo,$satirlar,$nerede)
{
if($this->tablokontrol($tablo))
{
for($a = 0; $a < count($nerede); $a++)
{
if($a%2 != 0)
{
if(is_string($nerede[$a]))
{
if(($a+1) != NULL)
{
$nerede[$a] = "'".$nerede[$a]."' AND ";
}
else
{
$nerede[$a] = "'".$nerede[$a]."'";
}
}
}
}
$nerede = implode('=',$nerede);
$sorgu = "UPDATE ".$tablo." SET ";
$anahtar = array_keys($satirlar);
for($b = 0; $b < count($satirlar); $b++)
{
if(is_string($satirlar[$anahtar[$b]]))
{
$sorgu .= $anahtar[$b]."='".$satirlar[$anahtar[$b]]."'";
}
else
{
$sorgu .= $anahtar[$b]."=".$satirlar[$anahtar[$b]];
}
if($b != count($satirlar)-1)
{
$sorgu .= ',';
}
}
$sorgu .= " WHERE ".$nerede;
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
3 mutlak değer olduğu ve kullanıcının girebileceği sınırsız $satirlar değişkeni yüzünden kod biraz uzadı.
İlk fonksiyonumuz ' SELECT ' için gerekli olan bir fonksiyonumuz kaldı
public function sonucGoster()
{
return $this->sonuc;
}
Ve bitti :) Şimdi bunu nasıl kullanacağız. Hemen index.php veya herhangi bir php dosyası oluşturalım.
$mysql = new mysql("localhost","root","sifrem","projedb");
?>
Bu komut ile mysql'e bağlandık hem de bağlantıyı kapattık :D Çünkü hiç işlem yapmadık gerek kalmadığını anladı ve kapattı :) Şimdi biraz işlem yapalım.
$mysql = new mysql("localhost","root","sifrem","projedb");
$mysql->sec("makaleler");
print_r($mysql->sonucGoster());
?>
Bu komut ile de makalelerin tümünü gösterdik istersek şöyle de yapabiliriz.
$mysql = new mysql("localhost","root","sifrem","projedb");
$mysql->sec("makaleler","id = 1");
print_r($mysql->sonucGoster());
?>
Bu şekilde de id'si 1 olan makaleyi aldık :)
Biraz veritabanına ekleme yapalım:
$mysql = new mysql("localhost","root","sifrem","projedb");
$konu = array("Lorem Ipsum","Loreeeemm Ipsummm");
$satirlar = array("baslik","icerik");
$mysql->ekle("makaleler",$konu,$satirlar);
?>
İşte bu kadar basitleştirdik :) Uzun SQL komutlarına gerek kalmadı.
Son olarak tüm sınıf dosyasını aşağıda bulabilirsiniz ;)
class mysql
{
private $dbadi = "";
private $sonuc = array();
private $baglandi = false;
public function __construct($dbhost,$dbkul,$dbsifre,$dbadi)
{
if(!$this->baglandi)
{
$baglanti = @mysql_connect($dbhost,$dbkul,$dbsifre);
if($baglanti)
{
$veritabani = @mysql_select_db($dbadi,$baglanti);
if($veritabani)
{
$this->baglandi = true;
$this->dbadi = $dbadi;
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
return true;
}
}
private function tablokontrol($tablo)
{
$tablolar = @mysql_query("SHOW TABLES FROM ".$this->dbadi." LIKE '".$tablo."'");
if($tablolar)
{
if(@mysql_num_rows($tablolar)==1)
{
return true;
}
}
else
{
return false;
}
}
public function sec($tablo, $satirlar = '*', $nerede = NULL, $sirala = NULL)
{
$sorgu = "SELECT ".$satirlar." FROM ".$tablo;
if($nerede != NULL)
{
$sorgu .= " WHERE ".$nerede;
}
if($sirala != NULL)
{
$sorgu .= " ORDER BY ".$sirala;
}
if($this->tablokontrol($tablo))
{
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
$this->sonucsayisi = @mysql_num_rows($sorgula);
for($i = 0; $i < $this->sonucsayisi; $i++)
{
$array = @mysql_fetch_array($sorgula);
$anahtar = array_keys($array);
for($a = 0; $a < count($anahtar); $a++)
{
if(!is_int($anahtar[$a]))
{
if(@mysql_num_rows($sorgula) > 1)
{
$this->sonuc[$i][$anahtar[$a]] = $array[$anahtar[$a]];
}
elseif(@mysql_num_rows($sorgula) < 1)
{
$this->sonuc = NULL;
}
else
{
$this->sonuc[$anahtar[$a]] = $array[$anahtar[$a]];
}
}
}
}
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
public function ekle($tablo,$degerler,$satirlar = NULL)
{
if($this->tablokontrol($tablo))
{
$sorgu = "INSERT INTO ".$tablo;
if($satirlar != NULL)
{
$sorgu .= " (".$satirlar.") ";
}
for($x = 0;$x < count($degerler); $x++)
{
if(is_string($degerler[$x]))
{
$degerler[$x] = "'".$degerler[$x]."'";
}
}
$degerler = implode(',',$degerler);
$sorgu .= " VALUES (".$degerler.") ";
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
public function sil($tablo, $nerede = NULL)
{
if($this->tablokontrol($tablo))
{
$sorgu = "DELETE FROM ".$tablo;
if($nerede != NULL)
{
$sorgu .= " WHERE ".$nerede;
}
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
public function yenile($tablo,$satirlar,$nerede)
{
if($this->tablokontrol($tablo))
{
for($a = 0; $a < count($nerede); $a++)
{
if($a%2 != 0)
{
if(is_string($nerede[$a]))
{
if(($a+1) != NULL)
{
$nerede[$a] = "'".$nerede[$a]."' AND ";
}
else
{
$nerede[$a] = "'".$nerede[$a]."'";
}
}
}
}
$nerede = implode('=',$nerede);
$sorgu = "UPDATE ".$tablo." SET ";
$anahtar = array_keys($satirlar);
for($b = 0; $b < count($satirlar); $b++)
{
if(is_string($satirlar[$anahtar[$b]]))
{
$sorgu .= $anahtar[$b]."='".$satirlar[$anahtar[$b]]."'";
}
else
{
$sorgu .= $anahtar[$b]."=".$satirlar[$anahtar[$b]];
}
if($b != count($satirlar)-1)
{
$sorgu .= ',';
}
}
$sorgu .= " WHERE ".$nerede;
$sorgula = @mysql_query($sorgu);
if($sorgula)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
public function sonucGoster()
{
return $this->sonuc;
}
public function __destruct()
{
if($this->baglandi)
{
if(@mysql_close())
{
$this->baglandi = false;
return true;
}
else
{
return false;
}
}
}
}
?>
Videolu Anlatım En Kısa Sürede Eklenecek!