PHP ile MYSQL Store Procedure Çağrımı

Evet arkadaşlar store procedure lafını çok duymuşsunuzdur. En çok duyduğunuz alanda ise 3 katmanlı mimari içindedir sanırım. Veri katmanını oluşturan kısım için önemli bir yapı şimdi bunu PHP ve MYSQL veri tabanı tarafından inceleyeceğiz. Bu dökümanda fazla syntax yapısına değinmeyeceğim. Bu dökümanın kapsamında MYSQL store procedure nasıl yazılır ve PHP içinde nasıl çağrılır onu göstermeye çalışacağım.

İlk olarak şunu belirtmek istiyorum, PHP ile MYSQL yapısına bağlantıyı hemen hemen herkes bilir connect ve select_db fakat kullandığım PHP sürümünde store procedure call ederken bir bug oluşuyormuş ve bendede bu bug oluştuğu için mysqli yapısını kullanacağım, mysqli yapısı hakkında bilgi almak istiyorsanız.

http://www.php.net/manual/en/mysqli.overview.php okumanızı tavsiye ederim. Syntax bir daha OOP dayalı. Hatta belirgin özelliklerini yazmışlar bende paylaşayım.

- Object-oriented interface

- Support for Prepared Statements

- Support for Multiple Statements

- Support for Transactions

- Enhanced debugging capabilities

- Embedded server support

Şimdi gelelim store procedure yazımına, dbForge Studio kullanıyorum bunu belirtmek isterim. Bu işlemleri phpMyadmin sql sorgusu alanındada işleyebilirsiniz. Fakat ben daha olması için bu tip editörler kullanıyorum. phpMyadmin üzerinde yazıp çalıştırmaya kalktığınızda DELIMETER gibi isteklerde bulununabilir fakat benim editörüm bunu kendisi yapıyor. Herneyse;

Bu çalışma için oluşturduğum veri tabanı şu şekilde:


--
-- Tablo yapısı: `tbltest`
--

CREATE TABLE IF NOT EXISTS `tbltest` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `News` text COLLATE utf8_turkish_ci,
  `NewsAuthor` varchar(50) COLLATE utf8_turkish_ci DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=2 ;

--
-- Tablo döküm verisi `tbltest`
--

INSERT INTO `tbltest` (`ID`, `News`, `NewsAuthor`) VALUES (1, 'Haber testidir.', 'gökalp');

Evet veri tabanımızı oluşturduk. Bir tablo ve 3 kolondan oluşan ID adında bir primary key taşıyan, veri tabanımızı oluşturduk ve içeri bir veri insert ettik.Şimdi gelelim procedure yazmaya. Hemen aşağıdaki kodumuzu işletelim.


CREATE DEFINER = 'root'@'localhost'
PROCEDURE workspacedb.fetchDependsOnID(IN _ID INTEGER (11))
BEGIN
  SET @USING_ID = _ID;
  SELECT
    *
  FROM
    WORKSPACEDB.tbltest
  WHERE
    TBLTEST.ID = @USING_ID;
END

Benim database adım workspacedb ve oluşturacağım procedure adına fetchDependsOnID ( id’ye bağlı olarak getir ) koydum.

IN _ID INTEGER (11) – > İçeri alınacak değerin tipini gönderiyor bir fonksiyon gibi düşünün.
BEGIN procedure başlangıç END ise bitiş kısmı.
SET @USING_ID = _ID; -> Anlicağınız üzere IN ile içeri alınan değişken value, içerdeki procedure değişkenine atandı.Set edildi.
Sonra query ifademizi oluşturduk ve WHERE şart alanından sonra set ettiğimiz değişkeni ile şartımızı bitirdik. Temel olarak olan olay şu oldu, IN içinde gelen veri, bir int veri ve bu int değerine sahip ID’li haberi getir.

Şimdi gelelim PHP alanımıza,


< ?php

 $mysqli = mysqli_init();
 $mysqli->real_connect("localhost","root","","workspacedb");

if ($re = $mysqli->real_query("call fetchDependsOnID(1)"))
{
   if($objResult = $mysqli->store_result())
    {
        while($row = $objResult->fetch_assoc())
        {
            $arr[]=$row;
        }
 //OUT:Array ( [0] => Array ( [ID] => 1 [News] => Haber testidir. [NewsAuthor] => gökalp ) )
        print_r($arr);
        $objResult->free_result();
    }
 }

?>

Gerekli syntaxlar yukarıda :) Dönüş sonuçta gördüğünüz gibi :
Array ( [0] => Array ( [ID] => 1 [News] => Haber testidir. [NewsAuthor] => gökalp ) )

Burda normal mysql_query(“”); gibi, fakat sql sorgusu göndermek yerine, CALL deyimi ile kendi prodecure ümüzü çağrıyoruz ve sonucun gelmesini bekliyoruz. :)

İyi çalışmalar
gökalp kuşçu

Tags: , , , , ,

  1. Can’s avatar

    bu yazıyı paylaştığınız için teşekkürler.
    Merak ettiğim , performans olarak +,- leri nelerdir.

  2. Gökalp Kuşçu’s avatar

    umarım yakın zamanda paylaşabilirim, + ve – ler olarak olaya değinmek güzel olucaktır.

  3. Can’s avatar

    store procedure => internal
    orm => external
    teknik olarak sınıflandırımsal yanlış mı olur?
    gaye olarak ikisi de bana aynı gelir.

  4. Gökalp Kuşçu’s avatar

    neden böyle bir teknik ayrıma gittiniz onu anlamadım php deki orm mantığını tam bilmiyorum fakat javadaki gibi düşünürsem proceduru etiketleyip entitylere değer aktarmak amaç, external store derim orm internali

Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>