Mobil Menü

Osman Bayrak ile PHP Dersleri: Başlangıçtan İleri Seviyeye

Giriş: PHP Nedir ve Neden Öğrenmelisiniz?

PHP (Hypertext Preprocessor), web geliştirme dünyasının temel taşlarından biridir. 1994 yılında Rasmus Lerdorf tarafından oluşturulan, günümüzde web sitelerinin %78’inden fazlasında kullanılıyor. WordPress, Facebook (ilk versiyonlarında), Wikipedia gibi dev platformlar PHP ile geliştirilmiştir.

PHP’nin Avantajları:

  • Açık kaynak kodlu ve ücretsiz
  • Kolay öğrenme eğrisi
  • Geniş kütüphane ve framework desteği
  • Veritabanı entegrasyonunda güçlü (MySQL, PostgreSQL, vs.)
  • Sunucu tarafında çalışması sayesinde güvenli

Bu rehberde, sıfırdan başlayarak PHP’nin temellerini, orta seviye konseptleri ve ileri düzey teknikleri öğreneceksiniz.

Bölüm 1: PHP Temelleri

1.1 PHP Kurulumu ve Temel Syntax

Çalıştırmak için bir web sunucusuna ihtiyacınız var. XAMPP, WAMP veya MAMP gibi paketlerle yerel geliştirme ortamı kurabilirsiniz.

<?php
    // Bu bir PHP kod bloğu
    echo "Merhaba Dünya!";
?>

PHP dosyaları .php uzantılı olmalıdır. Kodlar <?php ile başlar ve ?> ile biter (7+ sürümlerinde kapanış tag’ı zorunlu değildir).

1.2 Değişkenler ve Veri Tipleri

PHP’de değişkenler $ işareti ile başlar:

<?php
    $isim = "Ahmet";
    $yas = 25;
    $boy = 1.75;
    $ogrenci = true;

    echo $isim . " " . $yas . " yaşında"; // Nokta (.) birleştirme operatörü
?>

Temel veri tipleri:

  • String (Metin): $metin = "PHP";
  • Integer (Tam sayı): $sayi = 42;
  • Float (Ondalıklı): $fiyat = 19.99;
  • Boolean (Mantıksal): $aktif = true;
  • Array (Dizi): $renkler = array("kırmızı", "mavi");
  • Object (Nesne)
  • NULL

1.3 Operatörler

Aritmetik Operatörler:

$toplam = 10 + 5;  // 15
$fark = 10 - 5;    // 5
$carpim = 10 * 5;  // 50
$bolum = 10 / 5;   // 2
$mod = 10 % 3;     // 1

Karşılaştırma Operatörleri:

$esit = (10 == "10");  // true (değerler eşit)
$denk = (10 === "10"); // false (değer ve tip eşit değil)
$buyuk = (10 > 5);     // true
$kucuk = (10 < 5);     // false

Mantıksal Operatörler:

$ve = (true && false); // false
$veya = (true || false); // true
$degil = !true;        // false

1.4 PHP Kontrol Yapıları

if-elseif-else:

$not = 75;

if ($not >= 90) {
    echo "AA";
} elseif ($not >= 80) {
    echo "BA";
} elseif ($not >= 70) {
    echo "BB";
} else {
    echo "Kaldı";
}

switch-case:

$gun = "Pazartesi";

switch ($gun) {
    case "Pazartesi":
        echo "Haftanın ilk günü";
        break;
    case "Cuma":
        echo "Hafta sonu yakın";
        break;
    default:
        echo "Normal bir gün";
}

1.5 Döngüler

for döngüsü:

for ($i = 0; $i < 5; $i++) {
    echo $i . "<br>";
}

while döngüsü:

$sayi = 1;
while ($sayi <= 5) {
    echo $sayi . "<br>";
    $sayi++;
}

foreach döngüsü (diziler için):

$meyveler = array("Elma", "Armut", "Muz");

foreach ($meyveler as $meyve) {
    echo $meyve . "<br>";
}

Bölüm 2: Orta Seviye PHP

2.1 Fonksiyonlar

Temel fonksiyon:

function merhabaDe($isim) {
    return "Merhaba, " . $isim;
}

echo merhabaDe("Ayşe"); // Merhaba, Ayşe

Varsayılan parametre:

function topla($a, $b = 10) {
    return $a + $b;
}

echo topla(5);    // 15
echo topla(5, 20); // 25

2.2 Diziler (Arrays)

Indexli dizi:

$ogrenciler = array("Ahmet", "Mehmet", "Ayşe");
echo $ogrenciler[1]; // Mehmet

Associative dizi (key-value):

$ogrenci = array(
    "ad" => "Ahmet",
    "yas" => 22,
    "bolum" => "Bilgisayar"
);

echo $ogrenci["ad"]; // Ahmet

Çok boyutlu dizi:

$ogrenciler = array(
    array("Ahmet", 22, "Bilgisayar"),
    array("Mehmet", 21, "Matematik")
);

echo $ogrenciler[0][0]; // Ahmet

2.3 PHP Form İşlemleri

HTML formu (form.html):

<form action="kaydet.php" method="post">
    Ad: <input type="text" name="ad"><br>
    E-posta: <input type="email" name="email"><br>
    <input type="submit" value="Gönder">
</form>

Form verilerini işleme (kaydet.php):

$ad = $_POST['ad'];
$email = $_POST['email'];

echo "Hoş geldiniz " . htmlspecialchars($ad) . "<br>";
echo "E-posta: " . htmlspecialchars($email);

Güvenlik notu: Kullanıcı girdilerini her zaman htmlspecialchars() ile filtreleyin veya uygun sanitizasyon fonksiyonları kullanın.

2.4 Dosya İşlemleri

Dosya yazma:

$dosya = fopen("kayit.txt", "w");
fwrite($dosya, "Merhaba PHP!");
fclose($dosya);

Dosya okuma:

$dosya = fopen("kayit.txt", "r");
echo fread($dosya, filesize("kayit.txt"));
fclose($dosya);

// Veya kısa yöntem:
echo file_get_contents("kayit.txt");

Dosya kontrolü:

if (file_exists("kayit.txt")) {
    echo "Dosya mevcut";
} else {
    echo "Dosya bulunamadı";
}

Bölüm 3: Veritabanı İşlemleri (MySQL)

3.1 MySQL Bağlantısı

MySQLi ile bağlantı:

$sunucu = "localhost";
$kullanici = "root";
$sifre = "";
$veritabani = "okul";

// Bağlantı oluştur
$baglanti = new mysqli($sunucu, $kullanici, $sifre, $veritabani);

// Bağlantı kontrolü
if ($baglanti->connect_error) {
    die("Bağlantı hatası: " . $baglanti->connect_error);
}
echo "Bağlantı başarılı";

3.2 Sorgu Çalıştırma

Veri ekleme:

$sql = "INSERT INTO ogrenciler (ad, yas, bolum) VALUES ('Ahmet', 22, 'Bilgisayar')";

if ($baglanti->query($sql) === TRUE) {
    echo "Yeni kayıt oluşturuldu";
} else {
    echo "Hata: " . $sql . "<br>" . $baglanti->error;
}

Veri çekme:

$sql = "SELECT id, ad, yas FROM ogrenciler";
$sonuc = $baglanti->query($sql);

if ($sonuc->num_rows > 0) {
    while($satir = $sonuc->fetch_assoc()) {
        echo "ID: " . $satir["id"]. " - Ad: " . $satir["ad"]. " - Yaş: " . $satir["yas"]. "<br>";
    }
} else {
    echo "Sonuç bulunamadı";
}

3.3 Prepared Statements (Güvenli Sorgular)

$stmt = $baglanti->prepare("INSERT INTO ogrenciler (ad, yas, bolum) VALUES (?, ?, ?)");
$stmt->bind_param("sis", $ad, $yas, $bolum);

// Parametreleri ayarla ve çalıştır
$ad = "Mehmet";
$yas = 23;
$bolum = "Matematik";
$stmt->execute();

echo "Yeni kayıt eklendi";

$stmt->close();
$baglanti->close();

Bölüm 4: Nesne Yönelimli Programlama (OOP)

4.1 Sınıf ve Nesne

class Araba {
    // Özellikler
    public $marka;
    public $model;
    public $yil;

    // Constructor
    public function __construct($marka, $model, $yil) {
        $this->marka = $marka;
        $this->model = $model;
        $this->yil = $yil;
    }

    // Metot
    public function bilgileriGoster() {
        return $this->marka . " " . $this->model . " (" . $this->yil . ")";
    }
}

// Nesne oluşturma
$arabam = new Araba("Toyota", "Corolla", 2020);
echo $arabam->bilgileriGoster();

4.2 Miras Alma (Inheritance)

class ElektrikliAraba extends Araba {
    public $bataryaKapasitesi;

    public function __construct($marka, $model, $yil, $batarya) {
        parent::__construct($marka, $model, $yil);
        $this->bataryaKapasitesi = $batarya;
    }

    public function bilgileriGoster() {
        return parent::bilgileriGoster() . " - Batarya: " . $this->bataryaKapasitesi . " kWh";
    }
}

$elektrikli = new ElektrikliAraba("Tesla", "Model 3", 2022, 75);
echo $elektrikli->bilgileriGoster();

4.3 Interface ve Abstract Class

Interface:

interface OdemeArayuzu {
    public function odemeYap($miktar);
}

class KrediKarti implements OdemeArayuzu {
    public function odemeYap($miktar) {
        echo $miktar . " TL kredi kartı ile ödendi";
    }
}

$odeme = new KrediKarti();
$odeme->odemeYap(1000);

Abstract Class:

abstract class Sekil {
    abstract public function alanHesapla();

    public function yazdir() {
        echo "Alan: " . $this->alanHesapla();
    }
}

class Kare extends Sekil {
    private $kenar;

    public function __construct($kenar) {
        $this->kenar = $kenar;
    }

    public function alanHesapla() {
        return $this->kenar * $this->kenar;
    }
}

$kare = new Kare(5);
$kare->yazdir();

Bölüm 5: İleri Seviye PHP Konuları

5.1 Hata Yönetimi

Try-catch:

try {
    $dosya = fopen("olmayan_dosya.txt", "r");
    if (!$dosya) {
        throw new Exception("Dosya açılamadı");
    }
} catch (Exception $e) {
    echo "Hata: " . $e->getMessage();
} finally {
    echo "<br>İşlem tamamlandı";
}

Özel Exception Sınıfı:

class GecersizEmailException extends Exception {}

function emailKontrol($email) {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new GecersizEmailException("Geçersiz e-posta formatı");
    }
    echo "E-posta geçerli";
}

try {
    emailKontrol("gecersiz@email");
} catch (GecersizEmailException $e) {
    echo $e->getMessage();
}

5.2 Oturum Yönetimi (Sessions)

// Oturum başlatma
session_start();

// Oturum değişkenlerini ayarlama
$_SESSION['kullanici_adi'] = "ahmet123";
$_SESSION['giris_zamani'] = time();

// Oturum değişkenlerini kullanma
echo "Hoş geldiniz " . $_SESSION['kullanici_adi'];

// Oturumu sonlandırma
session_unset();
session_destroy();

5.3 Cookie İşlemleri

// Cookie oluşturma (1 gün geçerli)
setcookie("kullanici", "ahmet", time() + (86400 * 1), "/");

// Cookie okuma
if(isset($_COOKIE['kullanici'])) {
    echo "Kullanıcı: " . $_COOKIE['kullanici'];
}

// Cookie silme
setcookie("kullanici", "", time() - 3600, "/");

5.4 RESTful API Geliştirme

Basit API Örneği:

header("Content-Type: application/json");

// Basit bir veri kaynağı
$kitaplar = array(
    array("id" => 1, "baslik" => "PHP Kitabı", "yazar" => "Ahmet Yılmaz"),
    array("id" => 2, "baslik" => "JavaScript Kitabı", "yazar" => "Mehmet Demir")
);

// HTTP Metodunu al
$method = $_SERVER['REQUEST_METHOD'];

// İstek işleme
switch ($method) {
    case 'GET':
        echo json_encode($kitaplar);
        break;
    case 'POST':
        $data = json_decode(file_get_contents("php://input"), true);
        $yeniKitap = array(
            "id" => count($kitaplar) + 1,
            "baslik" => $data['baslik'],
            "yazar" => $data['yazar']
        );
        array_push($kitaplar, $yeniKitap);
        echo json_encode($yeniKitap);
        break;
    default:
        http_response_code(405);
        echo json_encode(array("mesaj" => "Method not allowed"));
        break;
}

Bölüm 6: Güvenlik En İyi Uygulamaları

6.1 SQL Injection Önleme

Tehlikeli örnek:

$kullaniciAdi = $_POST['kullanici_adi'];
$sql = "SELECT * FROM kullanicilar WHERE kullanici_adi = '$kullaniciAdi'";

Güvenli çözüm (Prepared Statements):

$stmt = $baglanti->prepare("SELECT * FROM kullanicilar WHERE kullanici_adi = ?");
$stmt->bind_param("s", $kullaniciAdi);
$stmt->execute();

6.2 XSS (Cross-Site Scripting) Önleme

Tehlikeli örnek:

echo $_GET['yorum'];

Güvenli çözüm:

echo htmlspecialchars($_GET['yorum'], ENT_QUOTES, 'UTF-8');

6.3 CSRF (Cross-Site Request Forgery) Önleme

Token kullanımı:

session_start();

// Form oluştururken
$token = bin2hex(random_bytes(32));
$_SESSION['token'] = $token;

echo '<form method="post">
    <input type="hidden" name="token" value="' . $token . '">
    <!-- Diğer form alanları -->
</form>';

// Form işlerken
if ($_POST['token'] !== $_SESSION['token']) {
    die("Geçersiz token");
}

Bölüm 7: Modern PHP Geliştirme

7.1 Composer ve Paket Yönetimi

Composer, PHP’nin bağımlılık yönetim aracıdır. composer.json dosyası ile proje bağımlılıklarını yönetebilirsiniz.

Örnek composer.json:

{
    "require": {
        "monolog/monolog": "^2.0"
    }
}

Composer ile paket yükleme:

composer require monolog/monolog

7.2 PHP Framework’leri

Popüler Framework’leri:

  • Laravel
  • Symfony
  • CodeIgniter
  • Yii
  • CakePHP

Laravel Örnek Route:

Route::get('/kullanici/{id}', function ($id) {
    return 'Kullanıcı ID: ' . $id;
});

7.3 Test Yazma (PHPUnit)

Basit test örneği:

use PHPUnit\Framework\TestCase;

class ToplamaTest extends TestCase {
    public function testToplama() {
        $this->assertEquals(4, topla(2, 2));
        $this->assertEquals(8, topla(5, 3));
    }
}

function topla($a, $b) {
    return $a + $b;
}

Bölüm 8: Veritabanı İşlemleri – PDO (PHP Data Objects)

8.1 PDO ile Veritabanı Bağlantısı

PDO, veritabanı işlemleri için daha güvenli ve tutarlı bir arayüz sunar:

$sunucu = "localhost";
$veritabani = "proje_db";
$kullanici = "db_kullanici";
$sifre = "guvenli_sifre123";

try {
    $db = new PDO("mysql:host=$sunucu;dbname=$veritabani;charset=utf8", $kullanici, $sifre);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "PDO bağlantısı başarılı";
} catch(PDOException $e) {
    echo "Bağlantı hatası: " . $e->getMessage();
}

8.2 PDO ile Sorgu Çalıştırma

Veri çekme (SELECT):

$sorgu = $db->query("SELECT * FROM kullanicilar");
$kullanicilar = $sorgu->fetchAll(PDO::FETCH_ASSOC);

foreach($kullanicilar as $kullanici) {
    echo $kullanici['ad'] . " - " . $kullanici['email'] . "<br>";
}

Hazırlanmış ifadeler (Prepared Statements):

$stmt = $db->prepare("INSERT INTO kullanicilar (ad, email, kayit_tarihi) VALUES (:ad, :email, :tarih)");
$stmt->execute([
    ':ad' => 'Mehmet Yılmaz',
    ':email' => 'mehmet@example.com',
    ':tarih' => date('Y-m-d H:i:s')
]);

echo $stmt->rowCount() . " kayıt eklendi";

Transaction Yönetimi:

try {
    $db->beginTransaction();

    // İlk işlem
    $db->exec("UPDATE hesaplar SET bakiye = bakiye - 100 WHERE id = 1");

    // İkinci işlem
    $db->exec("UPDATE hesaplar SET bakiye = bakiye + 100 WHERE id = 2");

    $db->commit();
    echo "Transfer başarılı";
} catch(Exception $e) {
    $db->rollBack();
    echo "Hata: " . $e->getMessage();
}

Bölüm 9: PHP’de Dosya ve Dizin İşlemleri

9.1 Dosya Yükleme Sistemi

HTML Formu:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="dosya">
    <button type="submit">Yükle</button>
</form>

PHP ile İşleme:

$hedefDizin = "uploads/";
$hedefDosya = $hedefDizin . basename($_FILES["dosya"]["name"]);
$yuklemeDurumu = 1;
$dosyaTipi = strtolower(pathinfo($hedefDosya, PATHINFO_EXTENSION));

// Dosya kontrolü
if(file_exists($hedefDosya)) {
    echo "Aynı isimde dosya zaten var.";
    $yuklemeDurumu = 0;
}

// Dosya boyutu kontrolü (max 5MB)
if($_FILES["dosya"]["size"] > 5000000) {
    echo "Dosya boyutu çok büyük.";
    $yuklemeDurumu = 0;
}

// İzin verilen dosya tipleri
$izinliTipler = ["jpg", "png", "jpeg", "gif", "pdf"];
if(!in_array($dosyaTipi, $izinliTiples)) {
    echo "Sadece JPG, JPEG, PNG, GIF ve PDF dosyaları yüklenebilir.";
    $yuklemeDurumu = 0;
}

// Dosyayı yükle
if($yuklemeDurumu == 0) {
    echo "Dosya yüklenemedi.";
} else {
    if(move_uploaded_file($_FILES["dosya"]["tmp_name"], $hedefDosya)) {
        echo "Dosya başarıyla yüklendi: " . htmlspecialchars(basename($_FILES["dosya"]["name"]));
    } else {
        echo "Dosya yüklenirken bir hata oluştu.";
    }
}

9.2 Dizin İşlemleri

Dizin oluşturma ve listeleme:

// Yeni dizin oluştur
if(!file_exists('yeni_dizin')) {
    mkdir('yeni_dizin', 0755);
}

// Dizin içeriğini listele
$dizin = 'uploads/';
$dosyalar = scandir($dizin);

foreach($dosyalar as $dosya) {
    if($dosya != "." && $dosya != "..") {
        echo $dosya . "<br>";
    }
}

// Dizin silme
if(is_dir('silinecek_dizin')) {
    rmdir('silinecek_dizin');
}

Bölüm 10: PHP’de Tarih ve Zaman İşlemleri

10.1 Temel Tarih İşlemleri

// Şu anki tarih ve saat
echo date('d.m.Y H:i:s'); // 20.05.2023 14:30:45

// Farklı formatlar
echo date('Y-m-d'); // 2023-05-20
echo date('l, F jS Y'); // Saturday, May 20th 2023

// Zaman damgası oluşturma
$zamanDamgasi = time();
echo $zamanDamgasi; // 1684585845

// Zaman damgasından tarih
echo date('d.m.Y H:i:s', 1684585845);

10.2 Tarih Hesaplamaları

// DateTime sınıfı
$bugun = new DateTime();
echo $bugun->format('Y-m-d');

// Tarih ekleme/çıkarma
$yarin = new DateTime('tomorrow');
$gelecekHafta = new DateTime('+1 week');
$gecenAy = new DateTime('-1 month');

// Tarih farkı hesaplama
$tarih1 = new DateTime('2023-01-15');
$tarih2 = new DateTime('2023-05-20');
$fark = $tarih1->diff($tarih2);

echo $fark->format('%a gün fark var'); // 125 gün fark var
echo $fark->format('%y yıl, %m ay, %d gün');

// Zaman dilimi ayarları
date_default_timezone_set('Europe/Istanbul');

Bölüm 11: PHP ve JSON

11.1 JSON Veri İşlemleri

Diziyi JSON’a çevirme:

$veri = array(
    'ad' => 'Ahmet',
    'soyad' => 'Yılmaz',
    'yas' => 30,
    'beceriler' => array('PHP', 'JavaScript', 'MySQL')
);

$jsonVeri = json_encode($veri, JSON_UNESCAPED_UNICODE);
echo $jsonVeri;

JSON’dan diziye çevirme:

$jsonString = '{"ad":"Ahmet","soyad":"Yılmaz","yas":30}';
$dizi = json_decode($jsonString, true);

echo $dizi['ad']; // Ahmet

11.2 API Tüketimi

API’den veri çekme:

$url = "https://api.ornek.com/kullanicilar";
$veri = file_get_contents($url);
$kullanicilar = json_decode($veri, true);

foreach($kullanicilar as $kullanici) {
    echo $kullanici['isim'] . "<br>";
}

// cURL ile daha gelişmiş istek
$curl = curl_init();
curl_setopt_array($curl, [
    CURLOPT_URL => "https://api.ornek.com/veri",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer token_123",
        "Content-Type: application/json"
    ]
]);
$cevap = curl_exec($curl);
curl_close($curl);

$sonuc = json_decode($cevap, true);

Bölüm 12: PHP’de Performans Optimizasyonu

12.1 Önbellekleme Teknikleri

OPCache Kullanımı:

// php.ini'de OPcache ayarları
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

Veri Önbelleğe Alma:

function getUrunler() {
    $cacheFile = 'cache/urunler.cache';

    // Önbellekte varsa
    if(file_exists($cacheFile) && (time() - filemtime($cacheFile) < 3600) {
        return unserialize(file_get_contents($cacheFile));
    }

    // Veritabanından çek
    $db = new PDO('mysql:host=localhost;dbname=proje', 'kullanici', 'sifre');
    $stmt = $db->query("SELECT * FROM urunler");
    $urunler = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // Önbelleğe yaz
    file_put_contents($cacheFile, serialize($urunler));

    return $urunler;
}

12.2 Veritabanı Optimizasyonu

Index Kullanımı:

ALTER TABLE kullanicilar ADD INDEX (email);

Sorgu Optimizasyonu:

// Kötü örnek
$stmt = $db->query("SELECT * FROM urunler WHERE kategori = 'elektronik'");

// İyi örnek
$stmt = $db->prepare("SELECT id, urun_adi, fiyat FROM urunler WHERE kategori = ?");
$stmt->execute(['elektronik']);

Sayfalama (Pagination):

$sayfa = isset($_GET['sayfa']) ? (int)$_GET['sayfa'] : 1;
$kayitSayisi = 10;
$baslangic = ($sayfa - 1) * $kayitSayisi;

$stmt = $db->prepare("SELECT * FROM urunler LIMIT :baslangic, :kayit_sayisi");
$stmt->bindParam(':baslangic', $baslangic, PDO::PARAM_INT);
$stmt->bindParam(':kayit_sayisi', $kayitSayisi, PDO::PARAM_INT);
$stmt->execute();
$urunler = $stmt->fetchAll();

// Toplam sayfa sayısı
$toplamKayit = $db->query("SELECT COUNT(*) FROM urunler")->fetchColumn();
$toplamSayfa = ceil($toplamKayit / $kayitSayisi);

Bölüm 13: PHP ile E-posta İşlemleri

13.1 PHPMailer Kütüphanesi

require 'vendor/autoload.php';

$mail = new PHPMailer\PHPMailer\PHPMailer();

try {
    // Sunucu ayarları
    $mail->isSMTP();
    $mail->Host = 'smtp.example.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'kullanici@example.com';
    $mail->Password = 'sifre';
    $mail->SMTPSecure = 'tls';
    $mail->Port = 587;
    $mail->CharSet = 'UTF-8';

    // Alıcılar
    $mail->setFrom('bilgi@firma.com', 'Firma Adı');
    $mail->addAddress('alici@example.com', 'Ali Alıcı');
    $mail->addReplyTo('cevap@firma.com', 'Cevap Adresi');

    // İçerik
    $mail->isHTML(true);
    $mail->Subject = 'Test E-postası';
    $mail->Body = '<h1>Merhaba!</h1><p>Bu bir test mesajıdır.</p>';
    $mail->AltBody = 'Merhaba! Bu bir test mesajıdır.';

    $mail->send();
    echo 'E-posta gönderildi';
} catch (Exception $e) {
    echo "E-posta gönderilemedi. Hata: {$mail->ErrorInfo}";
}

13.2 Basit E-posta Fonksiyonu

function mailGonder($alici, $konu, $mesaj) {
    $basliklar = "From: webmaster@example.com\r\n";
    $basliklar .= "Reply-To: cevap@example.com\r\n";
    $basliklar .= "MIME-Version: 1.0\r\n";
    $basliklar .= "Content-Type: text/html; charset=UTF-8\r\n";

    return mail($alici, $konu, $mesaj, $basliklar);
}

// Kullanım
if(mailGonder('alici@example.com', 'Konu', '<h1>Mesaj</h1>')) {
    echo 'E-posta gönderildi';
} else {
    echo 'Gönderim hatası';
}

Bölüm 14: PHP ile Güvenlik

14.1 Şifreleme ve Hash İşlemleri

Password Hashing:

$sifre = 'gizli_sifre123';

// Hash oluştur
$hash = password_hash($sifre, PASSWORD_DEFAULT);
echo $hash;

// Hash doğrulama
if(password_verify($sifre, $hash)) {
    echo 'Şifre doğru';
} else {
    echo 'Şifre yanlış';
}

// Hash güncelleme gerekiyor mu?
if(password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    $yeniHash = password_hash($sifre, PASSWORD_DEFAULT);
    // Veritabanında güncelle
}

Veri Şifreleme:

$veri = "Gizli veri";
$anahtar = "gizli_anahtar_32_karakter";

// Şifreleme
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$sifreliVeri = openssl_encrypt($veri, 'aes-256-cbc', $anahtar, 0, $iv);
$sifreliVeri = base64_encode($iv . $sifreliVeri);

// Çözme
$sifreliVeri = base64_decode($sifreliVeri);
$ivUzunluk = openssl_cipher_iv_length('aes-256-cbc');
$iv = substr($sifreliVeri, 0, $ivUzunluk);
$sifreliVeri = substr($sifreliVeri, $ivUzunluk);
$cozulmusVeri = openssl_decrypt($sifreliVeri, 'aes-256-cbc', $anahtar, 0, $iv);

echo $cozulmusVeri;

14.2 CSRF ve XSS Koruma

CSRF Token Sınıfı:

class CSRF {
    public static function tokenOlustur() {
        if(empty($_SESSION['csrf_token'])) {
            $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
        }
        return $_SESSION['csrf_token'];
    }

    public static function dogrula($token) {
        if(!empty($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token)) {
            return true;
        }
        return false;
    }
}

// Kullanım
$token = CSRF::tokenOlustur();
// Formda hidden input olarak ekle

// Form gönderiminde
if(!CSRF::dogrula($_POST['csrf_token'])) {
    die('Geçersiz CSRF token');
}

XSS Temizleme Fonksiyonu:

function temizle($veri) {
    if(is_array($veri)) {
        return array_map('temizle', $veri);
    }
    return htmlspecialchars($veri, ENT_QUOTES | ENT_HTML5, 'UTF-8');
}

// Kullanım
$_POST = temizle($_POST);
$_GET = temizle($_GET);

Bölüm 15: Modern PHP Uygulamaları

15.1 Laravel Framework’e Giriş

Laravel Kurulumu:

composer create-project --prefer-dist laravel/laravel blog

Route ve Controller:

// routes/web.php
Route::get('/merhaba', function () {
    return view('merhaba', ['isim' => 'Ahmet']);
});

Route::get('/kullanici/{id}', 'UserController@show');

// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Models\User;

class UserController extends Controller {
    public function show($id) {
        $user = User::findOrFail($id);
        return view('kullanici.profil', compact('user'));
    }
}

Eloquent ORM:

// Tüm kullanıcılar
$kullanicilar = User::all();

// Filtreleme
$aktifKullanicilar = User::where('aktif', 1)
                        ->orderBy('created_at', 'desc')
                        ->take(10)
                        ->get();

// Yeni kayıt
$user = new User;
$user->name = 'Ahmet';
$user->email = 'ahmet@example.com';
$user->save();

15.2 Symfony Framework Temelleri

Symfony Kurulumu:

composer create-project symfony/website-skeleton proje

Controller ve Routing:

// src/Controller/BlogController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;

class BlogController extends AbstractController {
    /**
     * @Route("/blog/{slug}", name="blog_show")
     */
    public function show($slug) {
        return $this->render('blog/show.html.twig', [
            'slug' => $slug
        ]);
    }
}

Doctrine ORM:

// src/Entity/Product.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
 */
class Product {
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    // Getter ve Setter metodları
}

// Repository kullanımı
$products = $this->getDoctrine()
    ->getRepository(Product::class)
    ->findAll();

Sonuç ve İleri Adımlar

Bu kapsamlı rehberde PHP’nin temellerinden başlayarak modern web geliştirme tekniklerine kadar geniş bir yelpazede bilgi paylaştık. Günümüzde hala web geliştirme dünyasının en popüler dillerinden biri olmaya devam ediyor.

Öğrenmeye devam etmek için:

  1. Framework’ler öğrenin: Laravel, Symfony gibi modern framework’leri
  2. Test yazmayı öğrenin: PHPUnit, Pest
  3. API geliştirin: RESTful API’ler, GraphQL
  4. Mikroservis mimarisi: Lumen, Slim
  5. Performans optimizasyonu: OPcache, JIT derleme
  6. Docker ile containerizasyon: Uygulamalarını dockerize etme

Unutmayın, iyi bir geliştirici olmanın sırrı sürekli pratik yapmak ve yeni teknolojileri öğrenmektir. Kod yazmaya devam edin!

Osman Bayrak
Osman Bayrak

Yazılım Mühendisiyim. Teknoloji ve yazılıma meraklıyım.

Articles: 334