Merhaba Webkolog dostlarım!
Dinamik web sitelerinin kalbi genellikle bir veritabanında atar. Kullanıcı bilgilerini saklamaktan, blog yazılarını yönetmeye, ürün kataloglarını sunmaktan siparişleri takip etmeye kadar birçok web uygulaması, verilerini depolamak ve almak için bir veritabanına ihtiyaç duyar. PHP, özellikle MySQL gibi popüler veritabanlarıyla kolayca etkileşim kurmamızı sağlayan zengin bir fonksiyon setine sahiptir. Bu makalede, PHP 5.2 ve önceki versiyonlarında yaygın olarak kullanılan **MySQL veritabanı fonksiyonlarını** inceleyeceğim. Güvenlikten temel sorgu işlemlerine kadar birçok konuyu ele alacağız. Hadi gelin, verilerle nasıl konuşacağımızı öğrenelim!
Önemli Not: Eski MySQL Fonksiyonları Hakkında
Bu makalede ele alınan `mysql_` önekli fonksiyonlar, PHP'nin eski versiyonlarında (özellikle PHP 5.x serisinde) yaygın olarak kullanılmıştır. Ancak, **PHP 5.5.0 itibarıyla bu fonksiyonlar kullanımdan kaldırılmış (deprecated) ve PHP 7.0.0 ile tamamen kaldırılmıştır.** Modern PHP geliştirmelerinde **MySQLi** veya **PDO** gibi daha güncel, güvenli ve özellikli veritabanı uzantılarının kullanılması şiddetle tavsiye edilir. Bu makale, özellikle eski PHP 5.2 ortamlarında çalışanlar için bir referans niteliğindedir.
1. Veritabanına Bağlanma ve Seçme
Veritabanı işlemleri yapmadan önce, sunucuya bağlanmamız ve üzerinde çalışacağımız veritabanını seçmemiz gerekir.
<?php
// MySQL sunucusuna bağlantı kurar: mysql_connect()
// mysql_connect(sunucu_adi, kullanici_adi, sifre)
$sunucu = "localhost";
$kullanici = "root";
$sifre = "sizin_mysql_sifreniz"; // Kendi MySQL root şifrenizi buraya yazın
$baglanti = mysql_connect($sunucu, $kullanici, $sifre);
if (!$baglanti) {
die("Veritabanı bağlantısı kurulamadı: " . mysql_error()); // Bağlantı hatasını gösterir
}
echo "Veritabanına başarıyla bağlanıldı.<br>";
// Veritabanını seçer: mysql_select_db()
// mysql_select_db(veritabani_adi, baglanti_kaynagi)
$veritabani_adi = "webkolog_db"; // Kendi veritabanı adınızı buraya yazın
// Veritabanının var olduğunu varsayıyoruz. Yoksa oluşturmanız gerekebilir.
// mysql_query("CREATE DATABASE IF NOT EXISTS " . $veritabani_adi, $baglanti);
if (!mysql_select_db($veritabani_adi, $baglanti)) {
die("Veritabanı seçilemedi: " . mysql_error());
}
echo "Veritabanı başarıyla seçildi: <b>" . $veritabani_adi . "</b><br>";
// Bağlantıyı daha sonra kapatmayı unutmayın: mysql_close($baglanti);
?>
2. Sorgu Çalıştırma ve Sonuçları Alma
Bağlantıyı kurup veritabanını seçtikten sonra, SQL sorgularını çalıştırabilir ve sonuçları PHP kodumuzda işleyebiliriz.
<?php
// Önceki bağlantı kodunu buraya dahil edelim (varsayımsal olarak):
$baglanti = mysql_connect("localhost", "root", "sizin_mysql_sifreniz");
mysql_select_db("webkolog_db", $baglanti);
// Test için bir tablo oluşturalım (eğer yoksa)
mysql_query("CREATE TABLE IF NOT EXISTS kullanicilar (
id INT AUTO_INCREMENT PRIMARY KEY,
ad VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL
)", $baglanti);
// Örnek veri ekleyelim (eğer tablo boşsa)
// mysql_affected_rows() ile kaç satır etkilendiğini kontrol edelim.
if (mysql_affected_rows($baglanti) == 0) { // Sadece tablo ilk oluşturulduğunda ekle
mysql_query("INSERT INTO kullanicilar (ad, email) VALUES ('Ayşe Yılmaz', '[email protected]')", $baglanti);
mysql_query("INSERT INTO kullanicilar (ad, email) VALUES ('Mehmet Can', '[email protected]')", $baglanti);
echo "Örnek kullanıcılar eklendi.<br>";
}
// SQL sorgusu çalıştırır: mysql_query()
// mysql_query(sorgu_stringi, baglanti_kaynagi)
$sorgu_sonucu = mysql_query("SELECT id, ad, email FROM kullanicilar", $baglanti);
if (!$sorgu_sonucu) {
die("Sorgu hatası: " . mysql_error($baglanti));
}
echo "Sorgu başarıyla çalıştırıldı.<br>";
echo "Kullanıcı Listesi:
";
echo "<ul>";
// Sorgu sonuçlarını satır satır okur ve işler
// mysql_fetch_row(): Sayısal indisli dizi döndürür (0, 1, 2...)
// mysql_fetch_assoc(): İlişkisel (anahtar-değer) dizi döndürür (ad, email...)
// mysql_fetch_array(): Hem sayısal hem ilişkisel dizi döndürür
while ($satir = mysql_fetch_assoc($sorgu_sonucu)) { // İlişkisel dizi tercih edilir
echo "<li>ID: <b>" . $satir['id'] . "</b>, Ad: <b>" . $satir['ad'] . "</b>, Email: <b>" . $satir['email'] . "</b></li>";
}
echo "</ul>";
// INSERT, UPDATE, DELETE gibi sorgularda etkilenen satır sayısını verir: mysql_affected_rows()
$ekle_sorgusu = mysql_query("INSERT INTO kullanicilar (ad, email) VALUES ('Zeynep Demir', '[email protected]')", $baglanti);
if ($ekle_sorgusu) {
$etkilenen_satir_sayisi = mysql_affected_rows($baglanti);
echo "INSERT işlemi sonucunda <b>" . $etkilenen_satir_sayisi . "</b> satır etkilendi.<br>";
} else {
echo "INSERT hatası: " . mysql_error($baglanti) . "<br>";
}
// Bağlantıyı kapat
mysql_close($baglanti);
?>
3. Güvenlik: SQL Enjeksiyonunu Önleme
Kullanıcıdan gelen verileri doğrudan SQL sorgularına eklemek, **SQL enjeksiyonu** adı verilen ciddi bir güvenlik açığına yol açabilir. Bu, kötü niyetli kullanıcıların veritabanınıza yetkisiz erişim sağlamasına veya verileri değiştirmesine olanak tanır. Bunu önlemek için, kullanıcıdan gelen tüm veriler sorguya eklenmeden önce özel karakterlerden arındırılmalıdır.
<?php
// Önceki bağlantı kodunu buraya dahil edelim:
$baglanti = mysql_connect("localhost", "root", "sizin_mysql_sifreniz");
mysql_select_db("webkolog_db", $baglanti);
// Kullanıcıdan geldiğini varsaydığımız bir değer
$kullanici_girisi = "O'Malley"; // İçinde özel karakter var
echo "<h5>SQL Enjeksiyonu ve Önleme:</h5>";
// Yanlış (Güvensiz) Kullanım:
// $guvenli_degil_sorgu = "SELECT * FROM kullanicilar WHERE ad = '" . $kullanici_girisi . "'";
// echo "Güvenli olmayan sorgu: <b>" . htmlspecialchars($guvenli_degil_sorgu) . "</b><br>";
// mysql_query($guvenli_degil_sorgu, $baglanti);
// Eğer $kullanici_girisi = "'; DROP TABLE kullanicilar; --" olsaydı, ciddi sorun yaşanırdı!
echo "<p><b>mysql_real_escape_string()</b> ile Güvenli Kullanım:</p>";
// Özel karakterlerden kaçış yapar: mysql_real_escape_string()
// mysql_real_escape_string(string, baglanti_kaynagi)
$guvenli_kullanici_girisi = mysql_real_escape_string($kullanici_girisi, $baglanti);
$guvenli_sorgu = "SELECT * FROM kullanicilar WHERE ad = '" . $guvenli_kullanici_girisi . "'";
echo "Güvenli sorgu: <b>" . htmlspecialchars($guvenli_sorgu) . "</b><br>";
$guvenli_sonuc = mysql_query($guvenli_sorgu, $baglanti);
if ($guvenli_sonuc) {
if (mysql_num_rows($guvenli_sonuc) > 0) {
echo "Kullanıcı bulundu!<br>";
} else {
echo "Kullanıcı bulunamadı.<br>";
}
} else {
echo "Sorgu hatası (güvenli): " . mysql_error($baglanti) . "<br>";
}
// Bağlantıyı kapat
mysql_close($baglanti);
?>
4. Hata Yönetimi: mysql_error()
Veritabanı işlemleri sırasında hatalar oluşabilir (örn. yanlış sorgu sözdizimi, veritabanı bağlantı sorunları). Bu hataları yakalamak ve kullanıcıya dostça mesajlar göstermek önemlidir. Geliştirme aşamasında hataları görmek, sorunları tespit etmenize yardımcı olurken, üretimde bu hataları doğrudan kullanıcıya göstermemelisiniz.
<?php
// Önceki bağlantı kodunu buraya dahil edelim:
$baglanti = mysql_connect("localhost", "root", "sizin_mysql_sifreniz");
mysql_select_db("webkolog_db", $baglanti);
echo "<h5>Hata Yönetimi:</h5>";
// Yanlış bir SQL sorgusu çalıştıralım
$yanlis_sorgu = "SELECT * FROM kullanicilar WHERE adasdasd = 'Test'"; // 'adasdasd' diye bir sütun yok
$sonuc = mysql_query($yanlis_sorgu, $baglanti);
if (!$sonuc) {
// Son çağrılan MySQL fonksiyonundan gelen son hatayı döndürür: mysql_error()
echo "SQL Sorgu Hatası: <b>" . mysql_error($baglanti) . "</b><br>";
// Hata numarasını da alabiliriz: mysql_errno()
echo "Hata Kodu: <b>" . mysql_errno($baglanti) . "</b><br>";
} else {
echo "Sorgu başarıyla çalıştı (bu durumda çalışmayacak).<br>";
}
// Bağlantıyı kapat
mysql_close($baglanti);
?>
PHP'de MySQL veritabanı işlemleri, dinamik ve veri odaklı web uygulamaları oluşturmanın temelidir. `mysql_connect()`, `mysql_select_db()`, `mysql_query()`, `mysql_fetch_assoc()` ve `mysql_real_escape_string()` gibi fonksiyonlar, eski PHP versiyonlarında veritabanı etkileşimi için size yeterli araçları sağlar. Ancak tekrar vurgulamak isterim ki, güncel projelerde güvenlik ve performans nedeniyle **MySQLi** veya **PDO**'yu tercih etmeniz çok önemlidir. Her zaman kullanıcı girişlerini temizlemeyi ve olası hataları yönetmeyi unutmayın.
Webkolog'u takipte kalın!
Hepinize bol kodlu ve başarılı projeler dilerim!
0 yorum:
Yorum Gönder