PHP OOP Zincirleme Metotlar bir birleri ile bağıntılı metotlarda zincileme şekilde ardı ardına çağırarak kullanabilmekteyiz. Bu tip metotlar genelde veritabanı işlemlerinde kullanmayı tercih ediyoruz ama esnek bir yapıya sahip olması nedeniyle bir çok yerde kullanılabilmektedir. Php 5.4 versiyounu ile gelmiştir. Örnektede dikkat edilmesi gereken husus her metodun return $this; şeklinde geriye değer döndermesidir. Bu sayfada ben veritabanı sorgusunu zincirleme metodlar ile oluşturmak istedim. Oluşturduğunuz ilk metod dan sonra diğer metoda -> oparatörü ile bağlanarak bir sonraki metodu çağırıyoruz. Sınıf içerisinde metodlar ayrı ayrı oluşturuluyor ve bir tanede derleme metodu oluşturuyoruz. Temizle metodu ile ise klasımızın bir sonraki sql için değişken içerisindeki değerlerini sıfırlıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class slqCreat{ private $sqlTip,$tablo,$sart; //Dışa kapalı bu sınıfa özgü değişkenlerimizi tanımlıyoruz. public function veriOku(){ //Zincirleme metodun ilk halkasını oluşturyoruz. $this->sqlTip="select"; return $this; } public function tabloAdı($tablo){ //Sql sorgusu için tabloyu seçeceğimiz metodu oluşturalım $this->tablo=$tablo; return $this; } public function where($where){ //tabi her sql şart olmazsa olmaz. $this->sart=$where; return $this; } public function derle(){ //Şimdi oluşturmuş olduğumuz metolarımız birleştireceğimiz derleme metodumuzu oluşturuyoruz. return $this->sqlTip." * from ".$this->tablo." where ".$this->sart; } } $sql=new slqCreat(); //Sınıfımızı çağırdık //metoları sırasıyla ekledikten sonra son olarak derleme metodumuz çağırdık echo $sql->veriOku()->tabloAdı("ogrenci")->where("ogrId=1")->derle(); //çıktı :select * from ogrenci where ogrId=1 |
PHP OOP zincirleme metot kullanımları veritabanı bağlantılarında çok kullanılıyor özellikle bir framework kullanıyorsanız örnek bir yapıyla karşılaşacaksınızdır. Bu sebebten aşağıda PDO::QUERY metot ile ilgili bir php oop zincirleme sınıf oluşturdum. Projelerinizde rahatlıkla kullanabilirsiniz. Tabi isterseniz geliştirebilirsinizde. Başarılar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | class dbBag extends PDO{ private $sqlType,$tablo,$sart,$sira,$limit; public function __construct($dbname,$user,$pass,$charset){ //Sınıfı çağırdığımızda yapıcı metodumuzla veritabanı bağlantısı kuralım tabi bu bağlantı PDO sınıfında miras alınyor yani kalıtımı yapılıyor. try{ //bir üst sınıf olan PDO sınıfın construct yapıcı metodu çalıştırlıyor. parent::__construct("mysql:host=localhost;dbname=".$dbname.";charset=".$charset,$user,$pass,array( PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION )); }catch(PDOException $db_hata){ //Hatamız varsa bir üst katmanda yakalamak için baslıyoruz. throw $db_hata; } } public function select($sec=null){ //ilk olarak select metodumuzu oluşturalım. Burada seçilecek tablo varsa seçelim yoksa * ile hepsini seçelim $this->sqlType="select ".(empty($sec) ? '*':$sec); return $this; } public function tablo($tabloAdi=null){ //ikinci metod tablomuzun adını veriyoruz. $this->tablo=' from '.$tabloAdi; return $this; } public function where($sart=null,$param){ //Şartımız var ise soru işaretlerine göre parametreleri quote metoduyla güvenlikten geçiriyoruz. $data=null; $sql=$sart ? explode("?",$sart):array(); for($say=0;$say<count($sql)-1;$say++): $data.=$sql[$say].(is_int($param[$say]) ? $param[$say]:parent::quote($param[$say])); endfor; $this->sart=empty($data) ? '' : " where ".$data; return $this; } public function limit($limit=null,$param){ //bazen sql oluştururken limit belirlenecekse parametrelere göre sql güvenliğimizi alıyoruz. $limitData=null; $sql=empty($limit) ? $limit:explode("?",$limit); for($say=0;$say<count($sql)-1;$say++): $limitData.=$sql[$say].(is_int($param[$say]) ? $param[$say]: parent::quote($param[$say])); endfor; $this->limit=empty($limitData) ? $limit:" LIMIT ".$limitData; return $this; } public function sirala($order=null){ //sql sorgusunda sılama kullanılak istenirse $this->sira=' '.$order; return $this; } public function temizle(){ //sql oluşturulduktan sonra ikinci bir sql e hazırlanmak üzere sınıfımızdaki değişkenleri temizliyoruz. $this->sqlType=null; $this->tablo=null; $this->sart=null; $this->sira=null; $this->limit=null; } public function calistir(){ try{ $gelenDizi=array(); $sql=$this->sqlType.$this->tablo.$this->sart.$this->sira.$this->limit; $gelenData=parent::query($sql); $this->temizle(); return $gelenData->fetchAll(PDO::FETCH_NUM); }catch(PDOException $db_hata){ echo $db_hata->getMessage(); } } } $veriBag=new dbBag("testdata","root","","utf8");//Veri tabanı bağlantısını kuruyoruz $gelenVeri=$veriBag->select('username,usermail')->tablo('userinfo')->where('id=?',array(1,2))->sirala('order by id ASC')->limit('?',array(1))->calistir(); //sqli oluşturduk ve çalıştı print_r($gelenVeri);//gelen değerleri ekrana basıyoruz. $gelenVeri=$veriBag->select()->tablo('userinfo')->calistir();//ikinci kez tablodaki bütün verileri istiyoruz ve çalışıyor. print_r($gelenVeri); |
Oluşturmuş olduğumuz sınfıları çalıştırıp deneme ve değişim yapabilmeniz için veritabanı kodlarını aşağıda sizinle paylaşıyorum. “testdata” adında veritabanı oluşturduktan sonra sql butonunda aşağıdaki sql i çalıştırmanız yeterli olacak.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | -- phpMyAdmin SQL Dump -- version 4.7.4 -- https://www.phpmyadmin.net/ -- -- Anamakine: 127.0.0.1 -- Üretim Zamanı: 03 Ara 2020, 00:32:04 -- Sunucu sürümü: 10.1.26-MariaDB -- PHP Sürümü: 7.0.29 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET AUTOCOMMIT = 0; START TRANSACTION; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Veritabanı: `testdata` -- DELIMITER $$ -- -- Yordamlar -- CREATE PROCEDURE `procedureUpdate` (IN `veriId` INT(11), IN `name` VARCHAR(550)) NO SQL update userinfo SET userinfo.username=name WHERE id=veriId$$ CREATE PROCEDURE `userinfoInsert` (IN `name` VARCHAR(500) CHARSET utf8, IN `pass` VARCHAR(32) CHARSET utf8, IN `eposta` VARCHAR(550) CHARSET utf8, IN `durum` INT(1)) NO SQL insert into userinfo VALUES(null,name,pass,eposta,durum)$$ CREATE PROCEDURE `userinfoselect` () NO SQL select * from userinfo$$ DELIMITER ; -- -------------------------------------------------------- -- -- Tablo için tablo yapısı `icerik` -- CREATE TABLE `icerik` ( `id` int(11) NOT NULL, `baslik` varchar(500) NOT NULL, `icerik` text NOT NULL, `user` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Tablo döküm verisi `icerik` -- INSERT INTO `icerik` (`id`, `baslik`, `icerik`, `user`) VALUES (2, 'SPOR HABER BAŞLIK', 'Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik Spor Haber İçerik ', 1); -- -------------------------------------------------------- -- -- Tablo için tablo yapısı `userdetay` -- CREATE TABLE `userdetay` ( `id` int(11) NOT NULL, `adres` text NOT NULL, `tel` varchar(15) NOT NULL, `aciklama` varchar(500) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Tablo döküm verisi `userdetay` -- INSERT INTO `userdetay` (`id`, `adres`, `tel`, `aciklama`) VALUES (1, 'TEST USER ADRES', '05435412306', 'WEBMASTER'), (2, 'TEST USER ADRES', '05439571508', 'WEBUSER'); -- -------------------------------------------------------- -- -- Tablo için tablo yapısı `userinfo` -- CREATE TABLE `userinfo` ( `id` int(11) NOT NULL, `username` varchar(250) NOT NULL, `userpass` varchar(32) NOT NULL, `usermail` varchar(150) NOT NULL, `userdurum` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Tablo döküm verisi `userinfo` -- INSERT INTO `userinfo` (`id`, `username`, `userpass`, `usermail`, `userdurum`) VALUES (1, 'testusername', '202cb962ac59075b964b07152d234b70', 'test@gmail.com', 1), (2, 'testusername', '202cb962ac59075b964b07152d234b70', 'test2@gmail.com', 1), (3, 'testusername', '202cb962ac59075b964b07152d234b70', 'test2@gmail.com', 1), (4, 'testusername', '123', 'usupersu@gmail.com', 1), (5, 'testusername', '123', 'usupersu@gmail.com', 1), (6, 'testusername', '123', 'usupersu@gmail.com', 1), (7, 'testusername', '123', 'usupersu@gmail.com', 1), (8, 'testusername', '123', 'usupersu@gmail.com', 1), (9, 'testusername', '123', 'usupersu@gmail.com', 1), (10, 'testusername', '123', 'usupersu@gmail.com', 1), (11, 'testusername', 'şifre', 'kirsehir@gmail.com', 1), (12, 'testusername', 'şifre', 'kirsehir@gmail.com', 1), (13, 'testusername', 'şifre', 'kirsehir@gmail.com', 1), (14, 'testusername', 'şifre', 'kirsehir@gmail.com', 1); -- -- Dökümü yapılmış tablolar için indeksler -- -- -- Tablo için indeksler `icerik` -- ALTER TABLE `icerik` ADD PRIMARY KEY (`id`), ADD KEY `user` (`user`); -- -- Tablo için indeksler `userdetay` -- ALTER TABLE `userdetay` ADD PRIMARY KEY (`id`); -- -- Tablo için indeksler `userinfo` -- ALTER TABLE `userinfo` ADD PRIMARY KEY (`id`); -- -- Dökümü yapılmış tablolar için AUTO_INCREMENT değeri -- -- -- Tablo için AUTO_INCREMENT değeri `icerik` -- ALTER TABLE `icerik` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; -- -- Tablo için AUTO_INCREMENT değeri `userdetay` -- ALTER TABLE `userdetay` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; -- -- Tablo için AUTO_INCREMENT değeri `userinfo` -- ALTER TABLE `userinfo` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=15; -- -- Dökümü yapılmış tablolar için kısıtlamalar -- -- -- Tablo kısıtlamaları `icerik` -- ALTER TABLE `icerik` ADD CONSTRAINT `icerik_ibfk_1` FOREIGN KEY (`user`) REFERENCES `userinfo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- -- Tablo kısıtlamaları `userdetay` -- ALTER TABLE `userdetay` ADD CONSTRAINT `userdetay_ibfk_1` FOREIGN KEY (`id`) REFERENCES `userinfo` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; |