PHP Eğitimi

PHP ANA SAYFA PHP'ye Giriş PHP Kurulumu PHP Sözdizimi PHP Yorumları PHP Değişkenleri PHP Yankı / Yazdır PHP Veri Türleri PHP Dizeleri PHP Numaraları PHP Matematik PHP Sabitleri PHP Operatörleri PHP If...Else...Elseif PHP Anahtarı PHP Döngüleri PHP Fonksiyonları PHP Dizileri PHP Süper Küreseller PHP Normal İfade

PHP Formları

PHP Form İşleme PHP Form Doğrulama PHP Formu Gerekli PHP Formu URL/E-posta PHP Formu Tamamlandı

PHP Gelişmiş

PHP Tarih ve Saat PHP Dahil PHP Dosya İşleme PHP Dosyası Aç/Oku PHP Dosyası Oluştur/Yaz PHP Dosya Yükleme PHP Çerezleri PHP Oturumları PHP Filtreleri PHP Filtreleri Gelişmiş PHP Geri Çağırma İşlevleri PHP JSON'u PHP İstisnaları

PHP OOP

PHP OOP nedir PHP Sınıfları/Nesneleri PHP Oluşturucu PHP Yıkıcı PHP Erişim Değiştiricileri PHP Kalıtımı PHP Sabitleri PHP Soyut Sınıfları PHP Arayüzleri PHP Özellikleri PHP Statik Yöntemler PHP Statik Özellikler PHP Ad Alanları PHP Yinelenebilirler

MySQL Veritabanı

MySQL Veritabanı MySQL Bağlantısı MySQL Veritabanı Oluştur MySQL Tablo Oluştur MySQL Veri Ekle MySQL Son Kimliği Al MySQL Ekle Çoklu MySQL Hazırlandı MySQL Seçim Verisi MySQL Nerede MySQL Sıralaması MySQL Verileri Sil MySQL Güncelleme Verileri MySQL Sınır Verileri

PHP XML'i

PHP XML Ayrıştırıcıları PHP SimpleXML Ayrıştırıcı PHP SimpleXML - Al PHP XML Expat'ı PHP XML DOM'si

PHP - AJAX

AJAX'a Giriş AJAX PHP AJAX Veritabanı AJAX XML'i AJAX Canlı Arama AJAX Anketi

PHP Örnekleri

PHP Örnekleri PHP Derleyici PHP Testi PHP Alıştırmaları PHP Sertifikası

PHP Referansı

PHP'ye Genel Bakış PHP Dizisi PHP Takvimi PHP Tarihi PHP Dizini PHP Hatası PHP İstisnası PHP Dosya Sistemi PHP Filtresi PHP FTP'si PHP JSON'u PHP Anahtar Kelimeler PHP Libxml PHP Postası PHP Matematik PHP Çeşitli PHP MySQLi PHP Ağı PHP Çıkış Kontrolü PHP Normal İfade PHP SimpleXML PHP Akışı PHP Dizisi PHP Değişken İşleme PHP XML Ayrıştırıcı PHP Posta Kodu PHP Saat Dilimleri

PHP MySQL Hazırlanmış İfadeler


Hazırlanan ifadeler SQL enjeksiyonlarına karşı oldukça faydalı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 ifadeler, 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 bir ş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
$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 = "[email protected]";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "[email protected]";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "[email protected]";
$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:

  • i - 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
$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 = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "[email protected]";
  $stmt->execute();

  // insert another row
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "[email protected]";
  $stmt->execute();

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