MySQLi Kullanarak CRUD İşlemleri
İlk olarak, MySQLi ile basit bir CRUD (Create, Read, Update, Delete) örneğine bakalım.
MySQLi Örneği
<?php
// Database connection
$conn = new mysqli("localhost", "root", "", "example_db");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// CREATE
$sql = "INSERT INTO users (name, age) VALUES ('John Doe', 25)";
$conn->query($sql);
// READ
$sql = "SELECT * FROM users";
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo $row['name'] . " - " . $row['age'] . "<br>";
}
// UPDATE
$sql = "UPDATE users SET age = 30 WHERE name = 'John Doe'";
$conn->query($sql);
// DELETE
$sql = "DELETE FROM users WHERE name = 'John Doe'";
$conn->query($sql);
$conn->close();
?>
MySQLi'nin Dezavantajları
SQL Enjeksiyon Açığı
Kullanıcı girdileri doğrudan SQL sorgularına eklenirse, saldırganlar kötü niyetli SQL kodları ekleyebilir. Örneğin:
$sql = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";
Eğer bu giriş korunmazsa, kullanıcı şu girdiyi sağlayabilir: John'; DROP TABLE users; --. Bu, users tablosunu silebilir.
Esneklik Eksikliği
MySQLi yalnızca MySQL veritabanlarını destekler, bu da gelecekte farklı bir veritabanına geçmek istediğinizde sorun yaratır.
Hazırlanmış Sorguların Kısıtlılığı
MySQLi, hazırlanan sorguları desteklese de, PDO kadar esnek ve kolay değildir.
PDO Kullanarak CRUD İşlemleri
Neden PDO?
PDO (PHP Data Objects), birçok avantaj sunar:
- Birden fazla veritabanını destekler (MySQL, SQLite, PostgreSQL vb.).
- Hazırlanan sorgularla SQL enjeksiyonuna karşı daha iyi koruma sağlar.
- Karmaşık sorgular için daha temiz ve okunabilir bir sözdizimi sunar.
PDO CRUD (Ekleme, Okuma, Güncelleme, Silme) Örneği
<?php
try{
$con = new PDO('mysql:host=localhost;dbname=veritabani', 'root', 'pass');
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// CREATE
$stmt = $con->prepare(
"INSERT INTO users (name, age) VALUES (:name, :age)"
);
$stmt->bindValue(':name', 'John Doe', PDO::PARAM_STR);
$stmt->bindValue(':age', 25, PDO::PARAM_INT);
$stmt->execute();
// READ
$stmt = $con->query(
"SELECT * FROM users"
);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo $row['name'] .' - '. $row['age'] . '<br>';
}
// UPDATE
$stmt = $con->prepare(
"UPDATE users SET :age WHERE name = :name"
);
$stmt->bindValue(':age', 30, PDO::PARAM_INT);
$stmt->bindValue(':name', 'Uğur AKÇIL', PARAM_STR);
$stmt->execute();
// DELETE
$stmt = $con->prepare(
"DELETE FROM users WHERE name = :name"
);
$stmt->bindValue(':name', 'Uğur AKÇIL', PDO::PARAM_STR);
$stmt->execute();
} catch(PDOException $e) {
echo "Error : ". $e->getMessage();
}
$con = null;
PDO’nun Anahtar Özellikleri ve Püf Noktaları
ATTR_ERRMODE ile Hata Yönetimi
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
PDO, hata durumunda istisna fırlatır, bu da hata ayıklamayı kolaylaştırır. Varsayılan hata yönetimiyle yaşanabilecek sessiz hataları önler.
bindValue ile SQL Injection'dan Korunma
bindValue veya bindParam, verilerin belirli veri türleri olarak ele alınmasını sağlar.
$stmt->bindValue(':name', 'John Doe', PDO::PARAM_STR);
$stmt->bindValue(':age', 25, PDO::PARAM_INT);
/*
PDO::PARAM_STR: Metin Değerleri için
PDO::PARAM_INT: Tamsayılar için
PDO::PARAM_BOOL: Boolean (True/False) değerler için
PDO::PARAM_NULL: Null değerler için
*/
Veri Çekme Modları
Verilerin nasıl çekileceğini özelleştirebilirsiniz:
$stmt->fetch(PDO::FETCH_ASSOC); // Dizi olarak döner
$stmt->fetch(PDO::FETCH_OBJ); // Nesne olarak döner
İşlemler (Transactions)
Birden fazla sorgunun birlikte çalışmasını garanti altına alabilirsiniz:
try {
$conn->beginTransaction();
$conn->exec("INSERT INTO users (name, age) VALUES ('User1', 20)");
$conn->exec("INSERT INTO users (name, age) VALUES ('User2', 25)");
$conn->commit();
} catch (PDOException $e) {
$conn->rollBack();
echo "Transaction failed: " . $e->getMessage();
}
Neden PDO Daha İyi?
Güvenlik
PDO’nun hazırlanan sorguları ve veri türü bağlamaları, SQL enjeksiyonuna karşı mükemmel koruma sağlar.
Esneklik
Birden fazla veritabanını destekleyen PDO, kodlarınızın gelecekteki uyumluluğunu garanti eder.
Ölçeklenebilirlik
İşlemler ve özel veri çekme modları gibi gelişmiş özellikler, PDO’yu büyük ölçekli uygulamalar için ideal kılar.
Okunabilir Sözdizimi
Daha temiz ve modüler bir kod yapısı, hata ayıklamayı ve bakımı kolaylaştırır.
Sonuç Olarak
Basit projeler için MySQLi yeterli olabilir, ancak PDO, özellikle üretim seviyesindeki uygulamalar için daha mantıklı bir seçimdir. Güvenliği, esnekliği ve gelişmiş özellikleriyle PDO, PHP ile veritabanı işlemleri için altın standarttır.
Yeni bir projeye başlıyorsanız, MySQLi’yi atlayıp doğrudan PDO’yu tercih edin. İlk kurulum biraz daha fazla çaba gerektirebilir, ancak uzun vadede avantajları fazlasıyla değerli olacaktır. Güvenli, ölçeklenebilir ve verimli bir kod her zaman buna değer!