PHP MYSQLI-PDO STORED PROCEDURE (SAKLI YORDAM) KULLANIMI
SQL için derlenmiş şablonlara Stored Procedure(Saklı Yordam) denir. Derlendikleri ve optimize dildikleri için
SQL hataların bulunmamaktadır. Bundan dolayı daha az kaynak kullanırlar ve normal bir SQL sorgusuna göre daha
hızlı çalışırlar. Saklı yordamlar veritabanından oluşturulduktan sonra üçüncü bir yazılımdan veya diğer bir
saklıyordam tarafından çağırılabilirler. Tek bir yazılım diline bağlı değillerdir. Saklı yordam oluşturmak için
CREATE PROCEDURE komutu kullanılır. Asıl SQL’lin bulunduğu bölüm BEGIN ve END blogu arasına yazılır. İç içe
BEGIN ve END blok uygulaması yapılabilir.
BEGIN – END:
1 2 3 4 5 | CREATE PROCEDURE saklıyordamismi(parametreler) karateristik özellik BEGIN SQL SORGUSU END |
PARAMETRESİZ SAKLI YORDAM
1 2 3 4 5 | DELIMITER $$ CREATE PROCEDURE oku() BEGIN SELECT * FROM guzelsozler limit 10; END $$ |
DELIMITER >> Ayraç görevi üstlenir. Standart SQL ayracı olan ; değiştirmeye yarar. Saklı yordam içinde biren fazla SQL’i bir birinden ayırmaya yarar.
PARAMETRELİ SAKLI YORDAM
1 2 3 4 5 | DELIMITER $$ CREATE PROCEDURE sayfa(IN id INT) BEGIN SELECT * FROM sayfalar sayfaid=id; END $$ |
SAKLI YORDAM PARAMETRELERİ:
1 2 3 | IN >> Girilen değişken OUT >> Çıkan değişken INOUT >> Hem giren hem çıkan değişken. |
INTO deyimi dışarı değişken gönderilmesini sağlar. Örnekte INOUT ile ad adında bir değişken SQL komutuna dahil
edilecek ve aynı zamanda ad adında veri tabanından gelen değer dışarı verilecek.
IN OUT:
1 2 3 4 5 | DELIMITER $$ CREATE PROCEDURE oku(IN id INT,OUT ad VARCHAR(50)) BEGIN SELECT adsoyad INTO ad FROM FROM okul WHERE sira=id; END $$ |
INOUT:
1 2 3 4 5 | DELIMITER $$ CREATE PROCEDURE oku(IN id INT,INOUT ad VARCHAR(50)) BEGIN SELECT adsoyad INTO ad WHERE sira=id OR adsoyad=ad; END; |
SAKLI YORDAMLARIN ÇAĞIRILMASI;
Saklı yordamı kaydetmek için phpMyAdmin penceresinden çalışmak istediğiniz veritabanını seçip SQL penceresine
tıklayarak aynen bir SQL penceresinden saklı yordamı çağırıp kullanabilirsiniz. Saklı yordamı çağırıp kullanmak için
CALL fonksinyonu kullanılır.
Saklı yordamın çağırılması örnek:
1 2 | CALL oku(2,@ad); SELECT @ad; |
SAKLI YORDAM KARAKTERİSTİK ÖZELLİKLERİ
CONTAINS SQL >> Veri okuma veya yazma ifadelerini içermediğini gösterir.
NO SQL >> Hiç bir sql ifadesi içermediğini gösterir.
READS SQL DATA >> Sadece okuma SELECT ifadeleri içerdiğini gösterir.
MODIFIES SQL DATA >> Sadece ekleme ve silme (INSERT veya DELETE) ifadeleri içerdiğini gösterir.
DETERMINISTIC >> Aynı parametrelerle her çağırıldığında aynı sonucu üreten sorgular için tanımlanır.
NON DETERMINISTIC >> Aynı parametrelerle her çağırıldığında farklı sonuç üreten sorgular için tanımlanır.
1 2 3 4 5 6 7 | DELIMITER $$ CREATE PROCEDURE kitap_oku(id INT) DETERMINISTIC READS SQL DATA BEGIN SELECT ad,soyad FROM yazar WHERE yaz_id=id; SELECT baslik FROM kitap WHERE yaz_id=id; END $$ |
MYSQLI ve PDO İLE SAKLI YORDAM OKUMA
MySqli sınıfında multi_query() metodu ile çoklu sql sorgusu çalıştırılmaktadır. Saklı yordamdaki sql sorguları tordam
içinde çalıştırılır ve sonucları döndürür. Sonuçları elde etmek için php mysqli sınıfından yararlanıyoruz.
TEKLİ MYSQLI YORDAM
1 2 3 4 5 6 7 8 9 10 11 12 | $dbmysqli=@new mysqli("localhost","root","cglr3193+","aolyedekweb"); if($dbmysqli->connect_errno) die("hata : ".$dbmysqli->connect_error); if(function_exists('mysqli_stmt_get_result')==false) die("mysqlnd desteği yok!"); $dbmysqli->set_charset("utf8"); $sqlsor=$dbmysqli->query("CALL sozoku10()"); if($sqlsor==false) die("hata : ".$sqlsor->connect_error); while($sqlgelen=$sqlsor->fetch_array()){ printf(" %s - %s",$sqlgelen['soz_sahibi'],$sqlgelen['guzel_soz']); } $dbmysqli->close(); |
TEKLİ SAKLI YORDAM PDO
1 2 3 4 5 6 7 8 9 | $dbpdo=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); $dbpdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8'); $dbpdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $dbsql=$dbpdo->query("CALL sozoku10()"); if($dbsql==false) die("hata"); while($verigelen=$dbsql->fetch(PDO::FETCH_ASSOC)){ printf("%s - %s",$verigelen['soz_sahibi'],$verigelen['guzel_soz']); } $dbpdo=null; |
ÇOKLU MYSQLI SAKLI SQL YORDAM
Çoklu saklı yordamda sql gönderimi multi_query() fonksiyonu ile yapılır. Veriler store_result() ile ilk sql
alınır next_result() ile ikinci sql sorgusunun verileri alnır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $dbmysqli=@new mysqli("localhost","root","cglr3193+","aolyedekweb"); if($dbmysqli->connect_errno) die("hata : ".$dbmysqli->connect_error); if(function_exists('mysqli_stmt_get_result')==false) die("mysqlnd desteği yok!"); $dbmysqli->set_charset("utf8"); $dbsql=$dbmysqli->multi_query("CALL guzelsozler(40)"); $dbsonuc=$dbmysqli->store_result(); while($sql1=$dbsonuc->fetch_array()){ printf("%s - %s",$sql1['soz_sahibi'],$sql1['guzel_soz']); } $dbsonuc->free(); $dbmysqli->next_result(); $dbsonuc=$dbmysqli->store_result(); while($sql2=$dbsonuc->fetch_array()){ printf("%s - %s - %s",$sql2['trplakakod'],$sql2['triladi'],$sql2['trilceadi']); } |
Ekran Çıktısı:
AHİ EVRÂN-I VELİ – Gelen gelsin saadetle, giden gitsin selametle.
40 – KIRŞEHİR – ÇİÇEKDAĞI
40 – KIRŞEHİR – KAMAN
40 – KIRŞEHİR – MERKEZ
40 – KIRŞEHİR – MUCUR
40 – KIRŞEHİR – AKPINAR
40 – KIRŞEHİR – AKÇAKENT
40 – KIRŞEHİR – BOZTEPE
ÇOKLU SAKLI YORDAM PDO
1 2 3 4 5 6 7 8 9 10 11 | $dbPDO=new PDO("mysql:host=localhost; dbname=aolyedekweb;charset=utf8","root","cglr3193+"); $dbPDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sorsql=$dbPDO->query("CALL guzelsozler(40)"); while($sqlsonuc1=$sorsql->fetch(PDO::FETCH_ASSOC)){ printf("GÜNÜN SÖZÜ:%s %s",$sqlsonuc1['soz_sahibi'],$sqlsonuc1['guzel_soz']); } $sorsql->nextRowset(); while($sqlsonuc2=$sorsql->fetch(PDO::FETCH_ASSOC)){ printf("%s %s %s",$sqlsonuc2['triladi'],$sqlsonuc2['trilcekodu'],$sqlsonuc2['trilceadi']); } $dbPDO=NULL; |
Ekran Çıktısı:
EKRAN ÇIKTISI
GÜNÜN SÖZÜ:
AHİ EVRÂN-I VELİ Gelen gelsin saadetle, giden gitsin selametle.
KIRŞEHİR 1254 ÇİÇEKDAĞI
KIRŞEHİR 1429 KAMAN
KIRŞEHİR 1472 MERKEZ
KIRŞEHİR 1529 MUCUR
KIRŞEHİR 1754 AKPINAR
KIRŞEHİR 1869 AKÇAKENT
KIRŞEHİR 1890 BOZTEPE