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.