İçeriğe geç
← Blog

PHP ile MySQL Stored Procedure Kullanımı

17 Ağustos 2009, 21:33 PHP 4 dk 8.3k 3

Veritabanı geliştirme ile ilgilenen hemen herkes Stored Procedure (Saklı Yordam) kavramını duymuştur.

Stored Procedure’ler, veritabanı üzerinde çalışan ve belirli işlemleri yerine getiren yordamlar (procedures) yazmamızı sağlar. İçlerinde sorgular, koşullar, döngüler ve iş kuralları (Business Logic) bulunabilir. Her ne kadar günümüzde iş kurallarının büyük bölümü uygulama katmanında yazılsa da, bazı projelerde performans, güvenlik veya merkezi yönetim amacıyla Stored Procedure kullanımı tercih edilmektedir.

Bu yazıda Stored Procedure sözdizimini ayrıntılı olarak incelemek yerine;

  • MySQL’de basit bir Stored Procedure oluşturmayı,
  • PHP içerisinden bu yordamı çağırmayı,
  • Dönen sonucu nasıl okuyacağımızı

inceleyeceğiz.

MySQLi Kullanımı

Standart mysql_* fonksiyonları ile veritabanına bağlanmak oldukça kolaydır. Ancak PHP’nin bazı sürümlerinde Stored Procedure çağrıları sırasında çeşitli sorunlarla karşılaşılabiliyordu. Bu nedenle bu örnekte MySQLi kullanacağız.

MySQLi’nin öne çıkan özelliklerinden bazıları şunlardır:

  • Nesne yönelimli (Object-Oriented) kullanım desteği
  • Prepared Statement desteği
  • Çoklu sorgu (Multiple Statements) desteği
  • Transaction desteği
  • Gelişmiş hata ayıklama (Debugging)
  • Gömülü sunucu (Embedded Server) desteği

Örnek Veritabanı

Örneğimizde kullanacağımız tablo aşağıdaki gibidir.

SQL
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,

    PRIMARY KEY (`ID`)

) ENGINE=MyISAM
DEFAULT CHARSET=utf8
COLLATE=utf8_turkish_ci;

Test verimizi de ekleyelim.

SQL
INSERT INTO tbltest
(
    ID,
    News,
    NewsAuthor
)
VALUES
(
    1,
    'Haber testidir.',
    'gokalp'
);

Artık içerisinde tek kayıt bulunan örnek bir tabloya sahibiz.

Stored Procedure Oluşturma

Şimdi veritabanında bir Stored Procedure oluşturalım.

Bu örnekte verilen ID değerine göre ilgili haberi döndüren basit bir yordam hazırlıyoruz.

PHP
CREATE DEFINER='root'@'localhost'
PROCEDURE workspacedb.fetchDependsOnID(IN _ID INT)

BEGIN

    SET @USING_ID = _ID;

    SELECT
        *
    FROM
        tbltest
    WHERE
        ID = @USING_ID;

END

Burada dikkat edilmesi gereken noktalar şunlardır.

IN

PHP
IN _ID INT

Procedure dışarıdan bir parametre almaktadır.

Bu yapı, programlama dillerindeki fonksiyon parametrelerine benzetilebilir.


BEGIN / END

PHP
BEGIN
...
END

Procedure’ın başlangıç ve bitiş bloklarını ifade eder.


SET

PHP
SET @USING_ID = _ID;

Dışarıdan gelen parametre procedure içerisinde kullanılacak değişkene aktarılmaktadır.

Ardından bu değişken SQL sorgusunda kullanılmaktadır.

Kısacası;

Dışarıdan gelen ID değerine göre ilgili kayıt veritabanından getirilmektedir.

PHP Tarafından Procedure Çağırma

Şimdi oluşturduğumuz Stored Procedure’ü PHP içerisinden çağıralım.

PHP
<?php

$connection = mysqli_init();

$connection->real_connect(
    "localhost",
    "root",
    "",
    "workspacedb"
);

if ($connection->real_query("CALL fetchDependsOnID(1)")) {

    $result = $connection->store_result();

    if ($result) {

        $newsList = array();

        while ($row = $result->fetch_assoc()) {

            $newsList[] = $row;

        }

        print_r($newsList);

        $result->free_result();
    }
}

?>

Kodun çalışma mantığı oldukça basittir.

Öncelikle veritabanına bağlantı kuruluyor.

Ardından aşağıdaki satır ile Stored Procedure çalıştırılıyor.

PHP
$connection->real_query("CALL fetchDependsOnID(1)");

Burada SQL sorgusu yazmak yerine CALL anahtar kelimesi kullanılarak oluşturduğumuz procedure çağrılmaktadır.

Procedure çalıştıktan sonra dönen sonuç normal bir SELECT sorgusu gibi okunabilir.

Çıktı

Kod çalıştırıldığında aşağıdaki sonucu elde ederiz.

PHP
Array
(
    [0] => Array
        (
            [ID] => 1
            [News] => Haber testidir.
            [NewsAuthor] => gokalp
        )
)

Görüldüğü gibi Stored Procedure tarafından döndürülen veri PHP tarafında dizi (Array) olarak alınabilmektedir.

Sonuç

Stored Procedure’ler özellikle sık kullanılan sorguları tek bir noktada toplamak, belirli iş kurallarını veritabanı tarafında çalıştırmak ve uygulama ile veritabanı arasındaki iletişimi sadeleştirmek için kullanılabilir.

PHP tarafında ise normal SQL sorgularında olduğu gibi yalnızca CALL anahtar kelimesi kullanılarak procedure çalıştırılır ve dönen sonuç standart sorgu sonuçları gibi işlenebilir.

Bu örnekle birlikte hem MySQL tarafında basit bir Stored Procedure oluşturmayı hem de PHP kullanarak bu yordamı çağırmayı incelemiş olduk.

📝 Arşiv Notu

Bu yazı ilk olarak 2011 yılında hazırlanmıştır. Örnekler PHP 5 ve MySQL kullanılarak geliştirilmiştir. Günümüzde PDO, ORM çözümleri ve modern framework’ler yaygın olarak kullanılsa da, Stored Procedure mantığı ve kullanım şekli hâlâ birçok projede geçerliliğini korumaktadır.

3 yorum

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