Sobes.tech
Junior

Hazırlanmış sorgular nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bu, SQL sorgu şablonunun, verilerden ayrı olarak veritabanı sunucusuna gönderildiği zamanlarda güvenliği ve performansı artırmak için kullanılan bir yöntemdir.

Avantajlar:

  • SQL enjeksiyonlarına karşı koruma: Veriler, SQL kodunun bir parçası olarak değil, literal olarak veritabanı sunucusu tarafından işlenir.
  • Performans: Veritabanı sunucusu, sorgu planını önbelleğe alır, bu da aynı sorgunun farklı parametrelerle tekrar tekrar çalıştırılmasında zaman kazandırır.
  • Kolaylık: Kodu yapılandırmaya ve hata ayıklamayı kolaylaştırmaya olanak tanır.

Hazırlanmış sorgunun yürütülme aşamaları:

  1. Hazırlık (Prepare): Sorgu şablonu, sözdizimi kontrolü ve yürütme planı oluşturmak üzere veritabanı sunucusuna gönderilir. Şablonda, verilerin yerleştirileceği yerleri göstermek için yer tutucular kullanılır.
  2. Bağlama (Bind): Değişken değerleri, yer tutuculara bağlanır. Sunucu, bunları SQL kodu olarak yorumlamaz.
  3. Yürütme (Execute): Bağlanan değerlerle sorgu çalıştırılır.

PDO kullanarak PHP'de hazırlanan sorgu örneği:

// Veritabanına bağlanma (örnek)
$dsn = 'mysql:host=localhost;dbname=veritabanim';
$user = 'kullanici';
$password = 'sifre';

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Bağlantı hatası: ' . $e->getMessage());
}

// Yer tutucularla sorgu hazırlama
$stmt = $pdo->prepare("SELECT isim, email FROM kullanicilar WHERE id = :id");

// Değeri yer tutucuya bağlama
$userId = 1;
$stmt->bindParam(':id', $userId, PDO::PARAM_INT);

// Sorguyu çalıştırma
$stmt->execute();

// Sonuçları alma
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Kullanıcı adı: " . htmlspecialchars($user['isim']) . "<br>";
    echo "Kullanıcı emaili: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "ID'si $userId olan kullanıcı bulunamadı.";
}

Bu örnekte, :id isimli yer tutucu kullanılmıştır. Ayrıca, pozisyonel yer tutucular (?) da kullanılabilir.

// Pozisyonel yer tutucu ile sorgu hazırlama
$stmt = $pdo->prepare("SELECT isim, email FROM kullanicilar WHERE id = ?");

// Yer tutucuya değerle birlikte sorguyu çalıştırma
$userId = 2;
$stmt->execute([$userId]);

// Sonuçları alma
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($user) {
    echo "Kullanıcı adı: " . htmlspecialchars($user['isim']) . "<br>";
    echo "Kullanıcı emaili: " . htmlspecialchars($user['email']) . "<br>";
} else {
    echo "ID'si $userId olan kullanıcı bulunamadı.";
}
?>