Stored Procedure (Saklı Yordam), MySQL’de bir veya birden fazla SQL ifadesini içeren, yeniden kullanılabilir bir SQL betiğidir. Bu, özellikle PHP ve MySQL ile çalışırken tekrar eden işlemleri kolaylaştırır ve kodunuzu daha düzenli hale getirir.
1. MySQL’de Stored Procedure Oluşturma
Örnek bir prosedür oluşturalım. Bu prosedür, bir tablodan belirli bir kategorideki ürünleri listeleyecektir.
DELIMITER $$ CREATE PROCEDURE GetProductsByCategory(IN category_id INT) BEGIN SELECT * FROM products WHERE category_id = category_id; END $$ DELIMITER ;
- IN category_id: Giriş parametresidir.
SELECT * FROM products WHERE category_id = category_id;
: Veritabanında sorgu çalıştırır ve sonucu döndürür.
2. PHP ile Stored Procedure Çağırma
Stored Procedure çağırmak için PDO veya MySQLi kullanılabilir. Burada PDO ile bir örnek yapılmıştır.
<?php // Veritabanı bağlantısı $dsn = 'mysql:host=localhost;dbname=my_database;charset=utf8mb4'; $username = 'root'; $password = ''; try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Stored Procedure çağırma $category_id = 1; // Örnek kategori ID $stmt = $pdo->prepare("CALL GetProductsByCategory(:category_id)"); $stmt->bindParam(':category_id', $category_id, PDO::PARAM_INT); $stmt->execute(); // Sonuçları döndürme $results = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($results as $row) { echo "Product ID: " . $row['id'] . ", Name: " . $row['name'] . "<br>"; } } catch (PDOException $e) { echo "Hata: " . $e->getMessage(); } ?>
CALL GetProductsByCategory(:category_id)
: Stored Procedure’ü çağırır.bindParam
: Parametre bağlamak için kullanılır.
3. MySQLi ile Stored Procedure Çağırma (Alternatif)
<?php $mysqli = new mysqli("localhost", "root", "", "my_database"); if ($mysqli->connect_error) { die("Bağlantı hatası: " . $mysqli->connect_error); } $category_id = 1; // Örnek kategori ID $query = "CALL GetProductsByCategory(?)"; if ($stmt = $mysqli->prepare($query)) { $stmt->bind_param("i", $category_id); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo "Product ID: " . $row['id'] . ", Name: " . $row['name'] . "<br>"; } $stmt->close(); } $mysqli->close(); ?>
Stored Procedure Kullanım Avantajları
- Performans: Sorgular önceden derlenir ve saklanır.
- Yeniden Kullanılabilirlik: Aynı kodu farklı yerlerde kullanabilirsiniz.
- Güvenlik: Parametreler kullanıldığında SQL Injection riskini azaltır.
- Bakım Kolaylığı: SQL sorgularını prosedürler halinde düzenleyebilirsiniz