26 Ekim 2007 Cuma

PHP ile MySQL Fonksiyonları

Merhaba Webkolog dostlarım!

Dinamik web sitelerinin ve uygulamalarının kalbinde genellikle bir veritabanı yatar. Kullanıcı bilgileri, ürün katalogları, blog yazıları gibi pek çok veri, veritabanlarında saklanır ve web sitelerimizin beyni gibi çalışır. PHP, bu veritabanlarıyla iletişim kurmak için güçlü ve esnek araçlar sunar. Uzun yıllar boyunca, **MySQL veritabanları** ile etkileşim kurmanın en yaygın yollarından biri, PHP'nin yerleşik `mysql_` önekli fonksiyon setini kullanmaktı. Bu makalede, PHP 5.2 ve önceki versiyonlarında yaygın olarak kullanılan bu MySQL fonksiyonlarını derinlemesine inceleyeceğiz. Hadi gelin, veritabanlarınızla nasıl konuşacağımızı öğrenelim!


Önemli Not: mysql_* fonksiyonları kullanımdan kaldırıldı!

Bu makale, PHP 5.2 ve öncesi versiyonların özelliklerini yansıtmaktadır. Ancak, PHP'nin sonraki versiyonlarında (özellikle PHP 5.5'ten itibaren) `mysql_*` fonksiyonları resmi olarak kullanımdan kaldırılmıştır (deprecated) ve PHP 7.0 ile tamamen kaldırılmıştır. Bunun başlıca nedeni, bu fonksiyonların modern veritabanı ihtiyaçları (örneğin güvenli sorgulama için parametre bağlama, nesne yönelimli yaklaşım) için yetersiz kalması ve güvenlik açıklarına daha yatkın olmasıdır. Güncel projelerde mutlaka **MySQLi** veya **PDO** uzantılarını kullanmanızı şiddetle tavsiye ederim. Ancak, eski bir sistemi anlamak veya belirli kısıtlamalar altında çalışıyorsanız, bu makale size yol gösterecektir.


1. Veritabanı Bağlantısı Kurma

MySQL sunucusuyla iletişim kurmanın ilk adımı, bir bağlantı açmaktır. Bu bağlantı üzerinden tüm veritabanı işlemlerini gerçekleştiririz.


<?php
$vt_sunucu = "localhost";
$vt_kullanici = "root";
$vt_sifre = "your_password"; // Kendi MySQL şifrenizi girin
$vt_adi = "webkolog_db";

// MySQL sunucusuna bağlantı açar: mysql_connect()
// Bağlantı başarısız olursa FALSE döner
$baglanti = mysql_connect($vt_sunucu, $vt_kullanici, $vt_sifre);

if (!$baglanti) {
    // Bağlantı hatası durumunda hata mesajını verir: mysql_error()
    die("Veritabanı bağlantısı kurulamadı: " . mysql_error());
} else {
    echo "Veritabanı sunucusuna başarıyla bağlanıldı.<br>";

    // Sunucudan veritabanı seçer: mysql_select_db()
    $db_secim = mysql_select_db($vt_adi, $baglanti);

    if (!$db_secim) {
        die("Veritabanı seçilemedi: " . mysql_error());
    } else {
        echo "'" . $vt_adi . "' veritabanı başarıyla seçildi.<br>";
    }
}

// Kalıcı bağlantı açar: mysql_pconnect()
// Genellikle daha az tercih edilir çünkü kaynak yönetimini zorlaştırabilir.
// $kalici_baglanti = mysql_pconnect($vt_sunucu, $vt_kullanici, $vt_sifre);
// if ($kalici_baglanti) {
//     echo "Kalıcı bağlantı açıldı.<br>";
// }
?>

2. Sorgu Çalıştırma ve Veri Çekme

Veritabanından bilgi almak (SELECT), yeni veri eklemek (INSERT), mevcut veriyi güncellemek (UPDATE) veya silmek (DELETE) için sorgular kullanırız.


<?php
// Yukarıdaki bağlantı kodlarının çalıştığını varsayalım
$vt_sunucu = "localhost";
$vt_kullanici = "root";
$vt_sifre = "your_password";
$vt_adi = "webkolog_db";

$baglanti = mysql_connect($vt_sunucu, $vt_kullanici, $vt_sifre);
mysql_select_db($vt_adi, $baglanti);

// Örnek bir tablo ve veri oluşturalım (sadece örnek için, gerçek uygulamada tek seferlik yapın)
// Bu SQL sorgusunu MySQL istemcinizde manuel olarak da çalıştırabilirsiniz.
$tablo_olustur_sorgu = "
CREATE TABLE IF NOT EXISTS kullanicilar (
    id INT(11) AUTO_INCREMENT PRIMARY KEY,
    ad VARCHAR(50),
    email VARCHAR(100)
)";
mysql_query($tablo_olustur_sorgu, $baglanti);

// Eğer tablo boşsa örnek veri ekleyelim
$sayi_sorgu = mysql_query("SELECT COUNT(*) FROM kullanicilar", $baglanti);
$satir_sayisi_temp = mysql_result($sayi_sorgu, 0); // mysql_result() ile ilk satır ilk sütunu al

if ($satir_sayisi_temp == 0) {
    $ekle_sorgu1 = "INSERT INTO kullanicilar (ad, email) VALUES ('Ali Can', '[email protected]')";
    mysql_query($ekle_sorgu1, $baglanti);
    $ekle_sorgu2 = "INSERT INTO kullanicilar (ad, email) VALUES ('Ayşe Nur', '[email protected]')";
    mysql_query($ekle_sorgu2, $baglanti);
    echo "Örnek veriler eklendi.<br>";
}

// Veritabanına sorgu gönderir: mysql_query()
$sonuc = mysql_query("SELECT id, ad, email FROM kullanicilar", $baglanti);

if (!$sonuc) {
    die("Sorgu hatası: " . mysql_error());
}

// Sonuçtaki satır sayısını verir: mysql_num_rows()
echo "Toplam " . mysql_num_rows($sonuc) . " kayıt bulundu.<br>";

echo "<h5>Kullanıcı Listesi (mysql_fetch_array):</h5>";
// Sonuçları dizi değişkeni olarak alır: mysql_fetch_array()
// Hem sayısal hem de ilişkisel indeksli dizi döndürür.
while ($satir = mysql_fetch_array($sonuc)) {
    echo "ID: " . $satir['id'] . ", Ad: " . $satir['ad'] . ", Email: " . $satir[2] . "<br>";
}
// mysql_data_seek() ile sonucu başa sararak tekrar okuyabiliriz.
mysql_data_seek($sonuc, 0); // Sonuç satırında belirtilen sıraya geçer.

echo "<h5>Kullanıcı Listesi (mysql_fetch_assoc):</h5>";
// Sonuçları ilişkisel dizi olarak alır: mysql_fetch_assoc()
while ($satir = mysql_fetch_assoc($sonuc)) {
    echo "ID: " . $satir['id'] . ", Ad: " . $satir['ad'] . ", Email: " . $satir['email'] . "<br>";
}
mysql_data_seek($sonuc, 0);

echo "<h5>Kullanıcı Listesi (mysql_fetch_row):</h5>";
// Sonuçları sayısal indeksli dizi olarak alır: mysql_fetch_row()
while ($satir = mysql_fetch_row($sonuc)) {
    echo "ID: " . $satir[0] . ", Ad: " . $satir[1] . ", Email: " . $satir[2] . "<br>";
}
mysql_data_seek($sonuc, 0);

echo "<h5>Kullanıcı Listesi (mysql_fetch_object):</h5>";
// Sonuç satırını obje olarak alır: mysql_fetch_object()
while ($satir = mysql_fetch_object($sonuc)) {
    echo "ID: " . $satir->id . ", Ad: " . $satir->ad . ", Email: " . $satir->email . "<br>";
}

echo "<hr>";

// Veri güncelleme örneği
$guncelle_sorgu = "UPDATE kullanicilar SET ad = 'Ali Can Yılmaz' WHERE id = 1";
mysql_query($guncelle_sorgu, $baglanti);

// Bir önceki elemanı etkileyen satır sayısını verir: mysql_affected_rows()
echo "Güncellenen satır sayısı: " . mysql_affected_rows($baglanti) . "<br>";

// Bir önceki veri yerleştirmede oluşan otomatik veri değerini verir: mysql_insert_id()
// (Örnek olarak bir önceki ekleme işleminden sonra ID'yi alalım)
// mysql_insert_id() yalnızca bir AUTO_INCREMENT alanı olan bir tabloya INSERT veya UPDATE işlemi yapıldıktan sonra geçerlidir.
$yeni_id = mysql_insert_id($baglanti);
echo "Son eklenen ID: " . $yeni_id . "<br>"; // Eğer yukarıda ekleme olduysa onun ID'si gelir

// Sonuçlar için atanan hafızayı boşaltır: mysql_free_result()
mysql_free_result($sonuc);
echo "Sorgu sonuç hafızası boşaltıldı.<br>";
?>

3. Veritabanı ve Tablo Yönetimi

Veritabanlarını ve tabloları dinamik olarak oluşturmak, listelemek veya silmek için kullanılan fonksiyonlar.


<?php
// Yukarıdaki bağlantı kodlarının çalıştığını varsayalım
$vt_sunucu = "localhost";
$vt_kullanici = "root";
$vt_sifre = "your_password";

$baglanti = mysql_connect($vt_sunucu, $vt_kullanici, $vt_sifre);
if (!$baglanti) {
    die("Bağlantı hatası: " . mysql_error());
}

$yeni_db_adi = "test_webkolog_db";

// MySQL'de veritabanı açar: mysql_create_db()
// if (mysql_create_db($yeni_db_adi, $baglanti)) {
//     echo "'" . $yeni_db_adi . "' veritabanı başarıyla oluşturuldu.<br>";
// } else {
//     echo "'" . $yeni_db_adi . "' veritabanı oluşturulamadı: " . mysql_error() . "<br>";
// }

echo "<hr>";

// Sunucudaki tüm veritabanlarını listeler: mysql_list_dbs()
$dbs_sonuc = mysql_list_dbs($baglanti);
if ($dbs_sonuc) {
    echo "<h5>Mevcut Veritabanları:</h5>";
    while ($row = mysql_fetch_row($dbs_sonuc)) {
        echo "- " . $row[0] . "<br>";
    }
    mysql_free_result($dbs_sonuc);
}

echo "<hr>";

// Veritabanındaki tüm tabloları listeler: mysql_list_tables()
$tables_sonuc = mysql_list_tables($vt_adi, $baglanti);
if ($tables_sonuc) {
    echo "<h5>'" . $vt_adi . "' Veritabanındaki Tablolar:</h5>";
    while ($row = mysql_fetch_row($tables_sonuc)) {
        echo "- " . $row[0] . "<br>";
    }
    mysql_free_result($tables_sonuc);
}

echo "<hr>";

// Sonuçtaki Tüm Tablo Alanlarını Listeler: mysql_list_fields()
$alanlar_sonuc = mysql_list_fields($vt_adi, "kullanicilar", $baglanti);
if ($alanlar_sonuc) {
    echo "<h5>'kullanicilar' Tablosunun Alanları:</h5>";
    $alan_sayisi = mysql_num_fields($alanlar_sonuc); // Sonuçtaki alan sayısını verir
    for ($i = 0; $i < $alan_sayisi; $i++) {
        echo "Ad: " . mysql_field_name($alanlar_sonuc, $i) . ", "; // Alan adını verir
        echo "Tip: " . mysql_field_type($alanlar_sonuc, $i) . ", "; // Alan tipini verir
        echo "Uzunluk: " . mysql_field_len($alanlar_sonuc, $i) . ", "; // Alan uzunluğunu verir
        echo "Bayraklar: " . mysql_field_flags($alanlar_sonuc, $i) . "<br>"; // Alan bayraklarını verir
    }
    mysql_free_result($alanlar_sonuc);
}

// Sunucudan veritabanı siler: mysql_drop_db()
// Dikkatli kullanın! Veritabanını kalıcı olarak siler.
// if (mysql_drop_db($yeni_db_adi, $baglanti)) {
//     echo "'" . $yeni_db_adi . "' veritabanı başarıyla silindi.<br>";
// } else {
//     echo "'" . $yeni_db_adi . "' veritabanı silinemedi: " . mysql_error() . "<br>";
// }

// Bağlantıyı kapat
mysql_close($baglanti);
echo "MySQL bağlantısı kapatıldı.<br>";
?>

4. Hata ve Bilgi Fonksiyonları

Veritabanı işlemleri sırasında ortaya çıkan hataları yakalamak ve sunucu hakkında bilgi almak, hata ayıklama ve sistem sağlığı için önemlidir.


<?php
$vt_sunucu = "localhost";
$vt_kullanici = "root";
$vt_sifre = "your_password";
$vt_adi = "webkolog_db";

$baglanti = mysql_connect($vt_sunucu, $vt_kullanici, $vt_sifre);
if (!$baglanti) {
    die("Bağlantı hatası: " . mysql_error());
}
mysql_select_db($vt_adi, $baglanti);

// Hatalı bir sorgu deneyelim
mysql_query("SELECT * FROM olmayan_tablo", $baglanti);

// Bir önceki işlemdeki MySQL hata numarasını verir: mysql_errno()
echo "MySQL Hata Kodu: " . mysql_errno($baglanti) . "<br>";

// Bir önceki işlemdeki MySQL hata mesajını verir: mysql_error()
echo "MySQL Hata Mesajı: " . mysql_error($baglanti) . "<br>";

echo "<hr>";

// İstemcinin kullandığı kütüphane versiyonunu verir: mysql_get_client_info()
echo "MySQL İstemci Bilgisi: " . mysql_get_client_info() . "<br>";

// MySQL Ana makina bilgilerini verir: mysql_get_host_info()
echo "MySQL Host Bilgisi: " . mysql_get_host_info($baglanti) . "<br>";

// MySQL protokol bilgisini verir: mysql_get_proto_info()
echo "MySQL Protokol Bilgisi: " . mysql_get_proto_info($baglanti) . "<br>";

// MySQL sunucu bilgisini verir: mysql_get_server_info()
echo "MySQL Sunucu Bilgisi: " . mysql_get_server_info($baglanti) . "<br>";

// Son yapılan SQL işlemleri hakkında bilgi verir: mysql_info()
// INSERT, UPDATE, DELETE gibi sorgulardan sonra anlamlı bilgi verir.
$ekle_sorgu = "INSERT INTO kullanicilar (ad, email) VALUES ('Yeni Kullanıcı', '[email protected]')";
mysql_query($ekle_sorgu, $baglanti);
echo "Son işlem bilgisi: " . mysql_info($baglanti) . "<br>"; // Örn: Records: 1 Duplicates: 0 Warnings: 0

// MySQL sunucusuna bağlantısını kontrol eder: mysql_ping()
if (mysql_ping($baglanti)) {
    echo "MySQL sunucusu hala aktif.<br>";
} else {
    echo "MySQL sunucusuna bağlantı kesildi.<br>";
}

// Kullanılan karakter setinin adını döndürür: mysql_client_encoding()
echo "Kullanılan karakter seti: " . mysql_client_encoding($baglanti) . "<br>";

mysql_close($baglanti);
?>

5. SQL Enjeksiyonuna Karşı Koruma: mysql_escape_string()

Kullanıcıdan alınan verileri doğrudan SQL sorgularına eklemek, SQL enjeksiyonu adı verilen ciddi güvenlik açıklarına yol açabilir. `mysql_escape_string()` (veya takma adı `mysql_real_escape_string()`) bu tür saldırıları önlemek için kritik bir fonksiyondur.


<?php
$vt_sunucu = "localhost";
$vt_kullanici = "root";
$vt_sifre = "your_password";
$vt_adi = "webkolog_db";

$baglanti = mysql_connect($vt_sunucu, $vt_kullanici, $vt_sifre);
if (!$baglanti) {
    die("Bağlantı hatası: " . mysql_error());
}
mysql_select_db($vt_adi, $baglanti);

$kullanici_girisi = "O'Malley"; // Kötü niyetli olabilecek bir giriş
$temiz_giris = mysql_escape_string($kullanici_girisi); // MySQL'de kullanmak için stringleri uygun biçime dönüştürür.

$sorgu = "SELECT * FROM kullanicilar WHERE ad = '" . $temiz_giris . "'";
echo "Hazırlanan sorgu: " . htmlspecialchars($sorgu) . "<br>"; // Çıktı: SELECT * FROM kullanicilar WHERE ad = 'O\'Malley'

$sonuc = mysql_query($sorgu, $baglanti);

if ($sonuc) {
    if (mysql_num_rows($sonuc) > 0) {
        echo "Kayıt bulundu.<br>";
    } else {
        echo "Kayıt bulunamadı.<br>";
    }
    mysql_free_result($sonuc);
} else {
    echo "Sorgu hatası: " . mysql_error() . "<br>";
}

mysql_close($baglanti);
?>

PHP'nin `mysql_` fonksiyonları seti, geçmişte birçok web uygulamasının bel kemiği olmuştur. Veritabanı bağlantılarından sorgu yürütmeye, veri çekmekten hata yönetimine kadar geniş bir yelpazede işlevsellik sunar. Ancak, belirttiğim gibi, güvenlik ve modern geliştirme pratikleri açısından güncel projelerde MySQLi veya PDO gibi daha yeni uzantıları kullanmanız çok önemlidir. Yine de, bu fonksiyonları bilmek, eski sistemleri anlamak ve PHP'nin veritabanı etkileşimi tarihindeki yerini kavramak açısından değerlidir.

Webkolog'u takipte kalın!

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

0 yorum:

Yorum Gönder