Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
xranzei 1
xranzei
mavzermete 1
mavzermete
Hikaye Ekle

Altın Konu PHP MySQL Hazır İfadeler

  • Konuyu başlatan Konuyu başlatan ITJA
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 8
  • Görüntüleme Görüntüleme 511

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Hazırlanan ifadeler SQL enjeksiyonlarına karşı oldukça kullanışlıdır.


Hazırlanan İfadeler ve Bağlı Parametreler

Hazırlanmış bir ifade, aynı (veya benzer) SQL ifadelerini yüksek verimlilikle tekrar tekrar yürütmek için kullanılan bir özelliktir.

Hazırlanan ifadeler temel olarak şu şekilde çalışır:

  1. Hazırla: Bir SQL deyim şablonu oluşturulur ve veritabanına gönderilir. Parametreler ("?" etiketli) olarak adlandırılan belirli değerler belirtilmeden bırakılır. Örnek: MyGuests DEĞERLERİNE EKLE(?, ?, ?)
  2. Veritabanı, SQL deyimi şablonunda sorgu optimizasyonunu ayrıştırır, derler ve gerçekleştirir ve sonucu çalıştırmadan depolar.
  3. Yürüt: Daha sonra uygulama, değerleri parametrelere bağlar ve veritabanı ifadeyi yürütür. Uygulama, ifadeyi farklı değerlerle istediği kadar çalıştırabilir.
SQL deyimlerini doğrudan yürütmekle karşılaştırıldığında, hazırlanan deyimlerin üç ana avantajı vardır:

  • Hazırlanan deyimler, sorgudaki hazırlık yalnızca bir kez yapıldığından ayrıştırma süresini azaltır (ifade birden çok kez çalıştırılsa da)
  • Bağlı parametreler, tüm sorguyu değil, her seferinde yalnızca parametreleri göndermeniz gerektiğinden, sunucunun bant genişliğini en aza indirir
  • Hazırlanan ifadeler SQL enjeksiyonlarına karşı çok kullanışlıdır, çünkü daha sonra farklı bir protokol kullanılarak iletilen parametre değerlerinin doğru şekilde kaçılması gerekmez. Orijinal ifade şablonu harici girdiden türetilmezse, SQL enjeksiyonu gerçekleşemez.

MySQLi'de Hazırlanan İfadeler

Aşağıdaki örnek, MySQLi'de hazırlanmış ifadeleri ve bağlı parametreleri kullanır:

Örnek (Hazırlanan İfadelerle MySQLi)


PHP:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// set parameters and execute
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$conn->close();
?>

Yukarıdaki örnekten açıklanacak kod satırları:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

SQL'imizde, bir tamsayı, dize, çift veya blob değerini değiştirmek istediğimiz yere bir soru işareti (?) ekleriz.

Ardından bind_param() işlevine bir göz atın:

$stmt->bind_param("sss", $firstname, $lastname, $email);

Bu fonksiyon parametreleri SQL sorgusuna bağlar ve veritabanına parametrelerin ne olduğunu söyler. "sss" argümanı, parametrelerin olduğu veri türlerini listeler. s karakteri mysql'e parametrenin bir dizge olduğunu söyler.

Argüman dört türden biri olabilir:

  • ben - tamsayı
  • d - çift
  • s - dize
  • b - BLOB
Her parametre için bunlardan birine sahip olmalıyız.

MySQL'e ne tür verilerin bekleneceğini söyleyerek SQL enjeksiyon riskini en aza indiririz.

Not: Harici kaynaklardan (kullanıcı girişi gibi) herhangi bir veri eklemek istiyorsak, verilerin sterilize edilmesi ve doğrulanması çok önemlidir.



PDO'da Hazırlanan İfadeler

Aşağıdaki örnek, PDO'da hazırlanmış ifadeleri ve bağlı parametreleri kullanır:

Örnek (Hazırlanan İfadelerle PDO)


PHP:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // prepare sql and bind parameters
  $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
  VALUES (:firstname, :lastname, :email)");
  $stmt->bindParam(':firstname', $firstname);
  $stmt->bindParam(':lastname', $lastname);
  $stmt->bindParam(':email', $email);

  // insert a row
  $firstname = "John";
  $lastname = "Doe";
  $email = "john@example.com";
  $stmt->execute();

  // insert another row
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "mary@example.com";
  $stmt->execute();

  // insert another row
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "julie@example.com";
  $stmt->execute();

  echo "New records created successfully";
} catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
}
$conn = null;
?>
 

En Çok Reaksiyon Alan Mesajlar

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst