Bu ders için video bulunmamaktadır.
Bu derse başlamak veya ilerlemenizi kaydetmek için lütfen giriş yapın veya kayıt olun.
Ders İçeriği
Öğrenim Hedefleri
Bu dersin sonunda öğrenciler:
•PHP ile MySQL veritabanına güvenli bağlantı kurabilecek
•PDO ve MySQLi kullanarak veri işlemleri yapabilecek
•SQL Injection saldırılarından korunma yöntemlerini öğrenecek
•Hazırlanmış ifadeler (Prepared Statements) kullanabilecek
•Basit bir CRUD uygulaması geliştirebilecek
1. PHP ile MySQL Bağlantısı
PDO (PHP Data Objects) Kullanımı
PDO, farklı veritabanı türleri için tutarlı bir arayüz sağlar ve güvenlik açısından önerilir.
<?php
$servername = "localhost";
$username = "kullanici_adi";
$password = "sifre";
$dbname = "veritabani_adi";
try {
$pdo = new PDO("mysql:host=$servername;dbname=$dbname;charset=utf8", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Bağlantı başarılı!";
} catch(PDOException $e) {
echo "Bağlantı hatası: " . $e->getMessage();
}
?>
MySQLi Kullanımı
MySQLi, MySQL'e özel geliştirilmiş bir uzantıdır.
<?php
$servername = "localhost";
$username = "kullanici_adi";
$password = "sifre";
$dbname = "veritabani_adi";
// Nesne yönelimli yaklaşım
$mysqli = new mysqli($servername, $username, $password, $dbname);
if ($mysqli->connect_error) {
die("Bağlantı hatası: " . $mysqli->connect_error);
}
echo "Bağlantı başarılı!";
$mysqli->close();
?>
2. Güvenli Veri İşlemleri
SQL Injection Nedir?
SQL Injection, kötü niyetli kullanıcıların SQL sorgularına zararlı kod enjekte etmesidir.
Güvensiz Örnek:
// ASLA BÖYLE YAPMAYIN!
$kullanici_adi = $_POST['kullanici_adi'];
$sql = "SELECT * FROM kullanicilar WHERE kullanici_adi = '$kullanici_adi'";
Hazırlanmış İfadeler (Prepared Statements)
Güvenli veri işlemleri için hazırlanmış ifadeler kullanılmalıdır.
PDO ile Güvenli Sorgu:
<?php $kullanici_adi = $_POST['kullanici_adi'];
$sql = "SELECT * FROM kullanicilar WHERE kullanici_adi = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$kullanici_adi]);
$sonuc = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
MySQLi ile Güvenli Sorgu:
<?php $kullanici_adi = $_POST['kullanici_adi'];
$sql = "SELECT * FROM kullanicilar WHERE kullanici_adi = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $kullanici_adi);
$stmt->execute();
$sonuc = $stmt->get_result();
?>
3. CRUD İşlemleri
Create (Ekleme) İşlemi
<?php function kullaniciEkle($pdo, $ad, $email, $sifre) {
try {
$hashedPassword = password_hash($sifre, PASSWORD_DEFAULT);
$sql = "INSERT INTO kullanicilar (ad, email, sifre) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$ad, $email, $hashedPassword]);
return $pdo->lastInsertId(); } catch(PDOException $e) {
throw new Exception("Kullanıcı eklenirken hata: " . $e->getMessage()); } } // Kullanım
if ($_POST['kayit']) {
$yeni_id = kullaniciEkle($pdo,
$_POST['ad'], $_POST['email'],
$_POST['sifre']);
echo "Yeni kullanıcı ID: " . $yeni_id; } ?>
Read (Okuma) İşlemi
<?php function tumKullanicilariGetir($pdo) {
try {
$sql = "SELECT id, ad, email, kayit_tarihi FROM kullanicilar ORDER BY kayit_tarihi DESC";
$stmt = $pdo->query($sql);
return
$stmt->fetchAll(PDO::FETCH_ASSOC); } catch(PDOException $e) {
throw new Exception("Kullanıcılar getirilirken hata: " . $e->getMessage()); } }
function kullaniciGetir($pdo, $id) {
try {
$sql = "SELECT id, ad, email, kayit_tarihi FROM kullanicilar WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]); return
$stmt->fetch(PDO::FETCH_ASSOC); } catch(PDOException $e) {
throw new Exception("Kullanıcı getirilirken hata: " . $e->getMessage()); } } ?>
Update (Güncelleme) İşlemi
<?php function kullaniciGuncelle($pdo, $id, $ad, $email) {
try {
$sql = "UPDATE kullanicilar SET ad = ?, email = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$ad, $email, $id]);
return $stmt->rowCount(); } catch(PDOException $e) {
throw new Exception("Kullanıcı güncellenirken hata: " . $e->getMessage()); } } // Kullanım
if ($_POST['guncelle']) {
$etkilenen_satir = kullaniciGuncelle($pdo, $_POST['id'], $_POST['ad'], $_POST['email']);
echo $etkilenen_satir . " satır güncellendi."; } ?>
Delete (Silme) İşlemi
<?php function kullaniciSil($pdo, $id) {
try {
$sql = "DELETE FROM kullanicilar WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
return $stmt->rowCount(); } catch(PDOException $e) {
throw new Exception("Kullanıcı silinirken hata: " . $e->getMessage()); } } // Kullanım
if ($_POST['sil']) {
$etkilenen_satir = kullaniciSil($pdo, $_POST['id']); if ($etkilenen_satir > 0) {
echo "Kullanıcı başarıyla silindi.";
} else { echo "Silinecek kullanıcı bulunamadı."; } } ?>
4. Hata Yönetimi
Try-Catch Blokları
<?php try {
$pdo = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Veritabanı işlemleri
$stmt = $pdo->prepare("SELECT * FROM kullanicilar WHERE id = ?");
$stmt->execute([$id]);
$kullanici = $stmt->fetch(); } catch(PDOException $e) { // Veritabanı hatası
error_log("Veritabanı hatası: " . $e->getMessage());
echo "Bir hata oluştu. Lütfen daha sonra tekrar deneyin."; } catch(Exception $e) { // Genel hata
error_log("Genel hata: " . $e->getMessage());
echo "Beklenmeyen bir hata oluştu."; } ?>
5. Form Doğrulama ve Güvenlik
Veri Doğrulama
<?php function veriDogrula($veri) { $hatalar = []; // Ad kontrolü if (empty($veri['ad'])) { $hatalar[] = "Ad alanı boş olamaz."; } elseif (strlen($veri['ad']) < 2) { $hatalar[] = "Ad en az 2 karakter olmalıdır."; } // Email kontrolü if (empty($veri['email'])) { $hatalar[] = "Email alanı boş olamaz."; } elseif (!filter_var($veri['email'], FILTER_VALIDATE_EMAIL)) { $hatalar[] = "Geçerli bir email adresi giriniz."; } // Şifre kontrolü if (empty($veri['sifre'])) { $hatalar[] = "Şifre alanı boş olamaz."; } elseif (strlen($veri['sifre']) < 6) { $hatalar[] = "Şifre en az 6 karakter olmalıdır."; } return $hatalar; } // Kullanım if ($_POST['kayit']) { $hatalar = veriDogrula($_POST); if (empty($hatalar)) { // Veri geçerli, kayıt işlemini yap kullaniciEkle($pdo, $_POST['ad'], $_POST['email'], $_POST['sifre']); } else { // Hataları göster foreach ($hatalar as $hata) { echo "<p style='color: red;'>$hata</p>"; } } } ?>
XSS Koruması
<?php function guvenliCikti($veri) { return htmlspecialchars($veri, ENT_QUOTES, 'UTF-8'); } // Kullanım echo "<p>Kullanıcı adı: " . guvenliCikti($kullanici['ad']) . "</p>"; ?>
6. Oturum Yönetimi
Oturum Başlatma ve Kullanıcı Girişi
<?php session_start(); function kullaniciGirisi($pdo, $email, $sifre) { try { $sql = "SELECT id, ad, email, sifre FROM kullanicilar WHERE email = ?"; $stmt = $pdo->prepare($sql); $stmt->execute([$email]); $kullanici = $stmt->fetch(PDO::FETCH_ASSOC); if ($kullanici && password_verify($sifre, $kullanici['sifre'])) { $_SESSION['kullanici_id'] = $kullanici['id']; $_SESSION['kullanici_ad'] = $kullanici['ad']; $_SESSION['kullanici_email'] = $kullanici['email']; return true; } return false; } catch(PDOException $e) { throw new Exception("Giriş kontrolü sırasında hata: " . $e->getMessage()); } } // Kullanım if ($_POST['giris']) { if (kullaniciGirisi($pdo, $_POST['email'], $_POST['sifre'])) { header("Location: dashboard.php"); exit(); } else { echo "Email veya şifre hatalı!"; } } ?>
Oturum Kontrolü
<?php function oturumKontrol() { if (!isset($_SESSION['kullanici_id'])) { header("Location: giris.php"); exit(); } } // Korumalı sayfalarda kullanım session_start(); oturumKontrol(); ?>
7. Sayfalama (Pagination)
<?php function sayfalama($pdo, $sayfa = 1, $sayfa_basina = 10) { try { $offset = ($sayfa - 1) * $sayfa_basina; // Toplam kayıt sayısı $toplam_stmt = $pdo->query("SELECT COUNT(*) FROM kullanicilar"); $toplam_kayit = $toplam_stmt->fetchColumn(); $toplam_sayfa = ceil($toplam_kayit / $sayfa_basina); // Sayfalanmış veriler $sql = "SELECT id, ad, email, kayit_tarihi FROM kullanicilar ORDER BY kayit_tarihi DESC LIMIT ? OFFSET ?"; $stmt = $pdo->prepare($sql); $stmt->bindParam(1, $sayfa_basina, PDO::PARAM_INT); $stmt->bindParam(2, $offset, PDO::PARAM_INT); $stmt->execute(); $kullanicilar = $stmt->fetchAll(PDO::FETCH_ASSOC); return [ 'kullanicilar' => $kullanicilar, 'toplam_sayfa' => $toplam_sayfa, 'mevcut_sayfa' => $sayfa, 'toplam_kayit' => $toplam_kayit ]; } catch(PDOException $e) { throw new Exception("Sayfalama hatası: " . $e->getMessage()); } } ?>
8. Arama ve Filtreleme
<?php function kullaniciAra($pdo, $arama_terimi, $sayfa = 1, $sayfa_basina = 10) { try { $arama = "%$arama_terimi%"; $offset = ($sayfa - 1) * $sayfa_basina; // Toplam sonuç sayısı $toplam_sql = "SELECT COUNT(*) FROM kullanicilar WHERE ad LIKE ? OR email LIKE ?"; $toplam_stmt = $pdo->prepare($toplam_sql); $toplam_stmt->execute([$arama, $arama]); $toplam_kayit = $toplam_stmt->fetchColumn(); $toplam_sayfa = ceil($toplam_kayit / $sayfa_basina); // Arama sonuçları $sql = "SELECT id, ad, email, kayit_tarihi FROM kullanicilar WHERE ad LIKE ? OR email LIKE ? ORDER BY kayit_tarihi DESC LIMIT ? OFFSET ?"; $stmt = $pdo->prepare($sql); $stmt->execute([$arama, $arama, $sayfa_basina, $offset]); $kullanicilar = $stmt->fetchAll(PDO::FETCH_ASSOC); return [ 'kullanicilar' => $kullanicilar, 'toplam_sayfa' => $toplam_sayfa, 'mevcut_sayfa' => $sayfa, 'toplam_kayit' => $toplam_kayit, 'arama_terimi' => $arama_terimi ]; } catch(PDOException $e) { throw new Exception("Arama hatası: " . $e->getMessage()); } } ?>
Pratik Alıştırmalar
1.Kullanıcı Yönetim Sistemi: Kayıt, giriş, profil güncelleme özellikleri
2.Blog Sistemi: Yazı ekleme, düzenleme, silme, yorum sistemi
3.Ürün Kataloğu: Ürün ekleme, kategori yönetimi, arama
4.Rezervasyon Sistemi: Tarih seçimi, müsaitlik kontrolü
Sonraki Ders
Bir sonraki derste ileri seviye konuları (dosya yükleme, email gönderimi, API entegrasyonu) ve kapsamlı bir proje geliştirmeyi işleyeceğiz.