PHP Hazırlanan Deyimler
Gönderen: Kaan Tarih: 2018-10-11 12:44 Kategori: php5egitim | Okundu: 734
Hazırlanan ifadeler, SQL enjeksiyonlarına karşı çok kullanışlıdır.
Hazırlanmış İfadeler ve Bağlı Parametreler
Hazırlanan bir deyim, aynı (veya benzer) SQL deyimlerini yüksek verimlilikle art arda çalıştırmak için kullanılan bir özelliktir.
Hazırlanan ifadeler temel olarak şu şekilde çalışır:
- Hazırla: Bir SQL deyimi şablonu oluşturulur ve veritabanına gönderilir. Belirli değerler belirsiz bırakılır, parametreler olarak adlandırılır ("?" Etiketli). Örnek: MyGuests DEĞERLERİNİ TAKİP EDİN (?,?,?)
- Veritabanı, SQL deyim şablonu üzerinde sorgu optimizasyonunu ayrıştırır, derler ve gerçekleştirir ve sonucu yürütmeden depolar.
- Yürüt: Daha sonra, uygulama değerleri parametrelere bağlar ve veritabanı deyimi yürütür. Uygulama, ifadeyi farklı değerler ile istediği kadar çalıştırabilir
Doğrudan SQL deyimlerini yürütmekle karşılaştırıldığında, hazırlanan ifadelerin üç ana avantajı vardır:
- Hazırlanan ifadeler, sorgudaki hazırlık yalnızca bir kez yapıldığı için ayrıştırma süresini kısaltır (ifadenin birden çok kez çalıştırılmasına rağmen)
- Bağlanan parametreler, sunucuya bant genişliğini en aza indirir, çünkü yalnızca sorguyu her seferinde göndermez ve tüm sorguyu değil
- 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çması gerekmez. Özgün deyim şablonu harici girdiden türemediyse, SQL enjeksiyonu yapılamaz.
MySQLi'de hazırlanan ifadeler
Aşağıdaki örnek, MySQLi'de hazırlanmış ifadeleri ve ilişkili parametreleri kullanır:
Örnek (Hazırlanmış Deyimlerle 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 (?, ?, ?)"
Bizim SQL'de, bir tamsayı, dize, çift veya blob değerinde yer almak istediğimiz bir soru işareti (?) Ekliyoruz.
Ardından, bind_param () işlevine bir göz atın:
$stmt->bind_param("sss", $firstname, $lastname, $email);
Bu işlev parametreleri SQL sorgusuna bağlar ve veritabanına parametrelerin neler olduğunu söyler. "Sss" argümanı, parametrelerin olduğu veri tiplerini listeler. Karakter, mysql parametresinin bir dize olduğunu söyler.
Tartışma dört türden biri olabilir:
- ben - tamsayı
- d - çift
- s - dizi
- b - BLOB
Her parametre için bunlardan birine sahip olmalıyız.
Mysql'e hangi veri tipinin beklendiğini söyleyerek, SQL enjeksiyon riskini en aza indiririz.
Not: Harici kaynaklardan (kullanıcı girişi gibi) veri eklemek istiyorsak, verilerin dezenfekte edilmesi ve onaylanması çok önemlidir.
PDO'da hazırlanan ifadeler
Aşağıdaki örnek, PDO'da hazırlanmış ifadeleri ve ilişkili parametreleri kullanır:
Örnek (Hazırlanmış İfadeler ile 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]mple.com"; $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; ?>
Yorumlar:
(0)
Bu Kategoride Çok Okunanlar
![]() |
MySQL PHP Veri Güncelleme
958 kez okundu |
![]() |
PHP MySQL'e Bağlanın
901 kez okundu |
![]() |
PHP MySQL'e Veri Ekleme
863 kez okundu |
![]() |
PHP MySQL'den Veri Silme
862 kez okundu |
![]() |
PHP MySQL'e Çoklu Kayıtlar Ekleme
809 kez okundu |