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:
- Framework’ler öğrenin: Laravel, Symfony gibi modern framework’leri
- Test yazmayı öğrenin: PHPUnit, Pest
- API geliştirin: RESTful API’ler, GraphQL
- Mikroservis mimarisi: Lumen, Slim
- Performans optimizasyonu: OPcache, JIT derleme
- 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!