19 Temmuz 2019 Cuma

PHP ile MySQLi Kullanımı

Merhaba Webkolog takipçileri!

Bugün sizlere PHP ile MySQL veritabanı işlemlerini gerçekleştirmek için kullanabileceğimiz, modern ve güvenli bir uzantı olan MySQLi (MySQL Improved)'yi anlatacağım. Eski mysql_* fonksiyonlarının artık terk edilmesi ve PHP 7 ile tamamen kaldırılmasıyla birlikte, MySQLi veya PDO gibi uzantıları kullanmak bir zorunluluk haline geldi. Ben de bugün MySQLi'ye odaklanarak, veritabanı bağlantısından veri sorgulamaya, eklemeden güncellemeye kadar birçok konuya değineceğim.

Neden MySQLi Kullanmalıyız?

MySQLi, adından da anlaşılacağı gibi, eski mysql_* fonksiyonlarına göre geliştirilmiş ve iyileştirilmiş bir uzantıdır. Temel avantajları şunlardır:

  • Nesne Tabanlı ve Prosedürel Destek: MySQLi hem nesne tabanlı (object-oriented) hem de prosedürel (procedural) programlama yaklaşımlarını destekler. Bu, geliştiricilere esneklik sunar. Ben genellikle nesne tabanlı yaklaşımı tercih ediyorum çünkü daha düzenli ve modern bir yapı sunuyor.
  • Gelişmiş Güvenlik (Prepared Statements): En önemli özelliklerinden biri, hazırlanmış deyimler (prepared statements) ile SQL enjeksiyonu saldırılarına karşı koruma sağlamasıdır. Kullanıcıdan gelen verileri doğrudan SQL sorgusuna eklemek yerine, parametre olarak bağlamamıza olanak tanır, bu da güvenliği artırır.
  • Çoklu Sorgu Desteği: Tek bir bağlantı üzerinden birden fazla SQL sorgusu çalıştırma yeteneği sunar.
  • Gelişmiş Hata Raporlama: Daha detaylı ve kullanışlı hata bilgileri sağlar.

MySQLi Kurulumu

Modern PHP kurulumlarının çoğu MySQLi uzantısını varsayılan olarak içerir ve aktif eder. Ancak yine de kontrol etmek isterseniz:

  • PHP'nin php.ini dosyasında extension=mysqli satırının başında noktalı virgül (;) olmadığından emin olun. Eğer varsa kaldırın ve web sunucunuzu yeniden başlatın.
  • Linux sistemlerde, dağıtımınıza göre sudo apt-get install php-mysql veya sudo yum install php-mysql gibi komutlarla yüklemeniz gerekebilir.

Kurulumun başarılı olup olmadığını kontrol etmek için basit bir PHP dosyasına phpinfo(); yazıp çalıştırabilirsiniz. Çıktıda "mysqli" bölümünü görmeniz gerekir.


Veritabanı Bağlantısı

MySQLi ile veritabanına bağlanmanın nesne tabanlı yolu şöyledir:


<?php
$servername = "localhost";
$username = "root";
$password = "sifreniz"; // Kendi şifrenizi girin
$dbname = "veritabani_adi"; // Kendi veritabanı adınızı girin

// Yeni bir MySQLi nesnesi oluşturarak bağlantı kur
$conn = new mysqli($servername, $username, $password, $dbname);

// Bağlantıyı kontrol et
if ($conn->connect_error) {
    die("Bağlantı hatası: " . $conn->connect_error);
}
echo "Veritabanı bağlantısı başarıyla kuruldu!<br>";

// Bağlantıyı kapatmayı unutmayın!
// $conn->close();
?>

Prosedürel yaklaşım ise şu şekildedir:


<?php
$servername = "localhost";
$username = "root";
$password = "sifreniz";
$dbname = "veritabani_adi";

// mysqli_connect() ile bağlantı kur
$conn = mysqli_connect($servername, $username, $password, $dbname);

// Bağlantıyı kontrol et
if (!$conn) {
    die("Bağlantı hatası: " . mysqli_connect_error());
}
echo "Veritabanı bağlantısı başarıyla kuruldu!<br>";

// Bağlantıyı kapatmayı unutmayın!
// mysqli_close($conn);
?>

Ben makale boyunca genellikle nesne tabanlı yaklaşıma odaklanacağım, çünkü daha modern ve tutarlı bir yapı sunuyor.

Karakter setini ayarlamak, özellikle Türkçe karakterlerin doğru bir şekilde depolanması ve gösterilmesi için kritik öneme sahiptir:


// Bağlantı kurulduktan sonra karakter setini ayarla (nesne tabanlı)
$conn->set_charset("utf8");

// Veya prosedürel
// mysqli_set_charset($conn, "utf8");

Veri Ekleme (INSERT)

Veritabanına veri eklerken de hazırlanmış deyimler kullanmak güvenliği artırır:


<?php
// ... Bağlantı kodu burada ...

$ad = "Ayşe";
$soyad = "Yılmaz";
$email = "[email protected]";

// SQL sorgusunu hazırla (parametreler için ? kullan)
$stmt = $conn->prepare("INSERT INTO kullanicilar (ad, soyad, email) VALUES (?, ?, ?)");

// Parametreleri bağla ('sss' string, string, string anlamına gelir)
$stmt->bind_param("sss", $ad, $soyad, $email);

// Sorguyu çalıştır
if ($stmt->execute()) {
    echo "Yeni kayıt başarıyla eklendi.<br>";
    echo "Son eklenen ID: " . $conn->insert_id . "<br>"; // Son eklenen kaydın ID'si
} else {
    echo "Hata: " . $stmt->error . "<br>";
}

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

bind_param() fonksiyonunda ilk parametre, bağlanan değişkenlerin tiplerini belirtir:

  • i: integer (tam sayı)
  • d: double (ondalıklı sayı)
  • s: string (metin)
  • b: blob (büyük ikili obje, örneğin resim)

Veri Sorgulama (SELECT)

Veritabanından veri okuma da benzer şekilde hazırlanmış deyimlerle veya basit sorgularla yapılabilir:


<?php
// ... Bağlantı kodu burada ...

// Tüm kullanıcıları seçen basit bir sorgu (parametre içermediği için prepare kullanmaya gerek yok)
$sql = "SELECT id, ad, soyad, email FROM kullanicilar";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // Her satırı döngüyle al ve ekrana yazdır
    while ($row = $result->fetch_assoc()) { // fetch_assoc() ile sütun isimleriyle erişim
        echo "ID: " . $row["id"] . " - Ad: " . $row["ad"] . " - Soyad: " . $row["soyad"] . " - Email: " . $row["email"] . "<br>";
    }
} else {
    echo "Veritabanında kayıt bulunamadı.<br>";
}

// Parametreli sorgu örneği (belirli bir ID'ye göre kullanıcı seçimi)
$arancak_id = 1;
$stmt = $conn->prepare("SELECT id, ad, soyad FROM kullanicilar WHERE id = ?");
$stmt->bind_param("i", $arancak_id); // 'i' integer tipi için
$stmt->execute();
$result_param = $stmt->get_result(); // Hazırlanmış deyimin sonucunu al

if ($result_param->num_rows > 0) {
    while ($row = $result_param->fetch_assoc()) {
        echo "Parametreli Sorgu - ID: " . $row["id"] . " - Ad: " . $row["ad"] . " - Soyad: " . $row["soyad"] . "<br>";
    }
} else {
    echo "Belirtilen ID'ye sahip kullanıcı bulunamadı.<br>";
}

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

Veri Güncelleme (UPDATE)

Verileri güncellerken de güvenliğe dikkat etmek çok önemlidir:


<?php
// ... Bağlantı kodu burada ...

$yeni_email = "[email protected]";
$guncellenecek_id = 1;

$stmt = $conn->prepare("UPDATE kullanicilar SET email = ? WHERE id = ?");
$stmt->bind_param("si", $yeni_email, $guncellenecek_id); // 's' string, 'i' integer

if ($stmt->execute()) {
    echo "Kayıt başarıyla güncellendi. Etkilenen satır sayısı: " . $stmt->affected_rows . "<br>";
} else {
    echo "Güncelleme hatası: " . $stmt->error . "<br>";
}

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

Veri Silme (DELETE)

Veri silme işlemleri de aynı şekilde hazırlanmış deyimlerle yapılmalıdır:


<?php
// ... Bağlantı kodu burada ...

$silinecek_id = 2;

$stmt = $conn->prepare("DELETE FROM kullanicilar WHERE id = ?");
$stmt->bind_param("i", $silinecek_id); // 'i' integer

if ($stmt->execute()) {
    echo "Kayıt başarıyla silindi. Etkilenen satır sayısı: " . $stmt->affected_rows . "<br>";
} else {
    echo "Silme hatası: " . $stmt->error . "<br>";
}

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

MySQLi'nin Diğer Faydalı Özellikleri
  • $conn->insert_id: Son eklenen kaydın otomatik artan ID'sini döndürür.
  • $stmt->affected_rows: Son INSERT, UPDATE veya DELETE sorgusundan etkilenen satır sayısını döndürür.
  • $conn->error veya $stmt->error: Son hatanın metinsel açıklamasını döndürür.
  • $conn->errno veya $stmt->errno: Son hatanın hata kodunu döndürür.
  • $result->fetch_array(): Sonuç kümesindeki bir satırı hem sayısal hem de ilişkisel indislerle bir dizi olarak döndürür.
  • $result->fetch_row(): Sonuç kümesindeki bir satırı sayısal indislerle bir dizi olarak döndürür.
  • $result->fetch_all(): Tüm sonuç kümesini tek seferde bir dizi olarak döndürür. (MySQL Native Driver kurulu olmalıdır)

MySQLi, PHP ile MySQL veritabanı işlemlerini güvenli ve etkili bir şekilde gerçekleştirmenin modern yoludur. Özellikle hazırlanmış deyimler sayesinde SQL enjeksiyonu gibi güvenlik tehditlerine karşı büyük bir koruma sağlar. Projelerinizde veritabanı etkileşimi kurarken MySQLi'yi veya PDO'yu tercih etmeniz, uygulamanızın hem performansını hem de güvenliğini artıracaktır.

Umarım bu makale, MySQLi'nin gücünü ve kullanımını anlamanıza yardımcı olmuştur. Veritabanı etkileşimlerinde her zaman güvenlik önlemlerini almayı unutmayın!

Webkolog'u takipte kalın!

Hepinize hatasız ve başarılı kodlama deneyimleri dilerim!

0 yorum:

Yorum Gönder