PHP ile MySQL Stored Procedure Kullanımı
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.
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.
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.
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
IN _ID INT
Procedure dışarıdan bir parametre almaktadır.
Bu yapı, programlama dillerindeki fonksiyon parametrelerine benzetilebilir.
BEGIN / END
BEGIN
...
END
Procedure’ın başlangıç ve bitiş bloklarını ifade eder.
SET
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
$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.
$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.
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.
bu yazıyı paylaştığınız için teşekkürler.
Merak ettiğim , performans olarak +,- leri nelerdir.
umarım yakın zamanda paylaşabilirim, + ve – ler olarak olaya değinmek güzel olucaktır.
store procedure => internal
orm => external
teknik olarak sınıflandırımsal yanlış mı olur?
gaye olarak ikisi de bana aynı gelir.