Belirttiğiniz yönergeler doğrultusunda, paylaştığınız
müfredat metnini anlamsız ifadelerden arındırarak, süre/ders sayısı ve önizleme gibi teknik detayları temizledikten sonra tamamen eğitim
odaklı, derinlemesine ve bol örnekli bir rehbere dönüştürüyoruz.
Müfredatın yapısı oldukça geniş ve detaylı olduğu için,
eğitimin hakkını vermek, yüzeysel özetlerden kaçınmak ve her konuyu
uygulamalarıyla işlemek adına bu uzun içeriği parça parça ele alacağız.
İlk olarak "Öğrenecekleriniz" bölümünün
felsefesini ve bu eğitimle kazanacağınız vizyonu açıklayarak başlıyoruz.
Ardından birinci bölüm olan HTML ve Web Sitesi Kurmanın Temelleri
konusunu eksiksiz bir şekilde inşa edeceğiz.
🚀 Full Stack Web Tasarım ve Programlama Eğitimi: Bölüm 1
📌
"Öğrenecekleriniz" Bölümünün Detaylı Açıklaması
Bu eğitim, modern bir web geliştiricisi (Full Stack Developer) olmanız için gereken hem ön yüz (Frontend) hem de arka yüz (Backend)
teknolojilerini sıfırdan başlayarak bir araya getirmeyi hedefler. Bölüm bölüm kazanacağınız yetkinliklerin mantığı şudur:
🛠️ Temel Kurulumlar ve
Geliştirme Ortamı
Bir web sitesi geliştirmeye başlamak için sihirli araçlara
ihtiyacınız yoktur. Bilgisayarınızdaki basit bir not defteri bile kod yazmak
için yeterlidir ancak süreci hızlandırmak ve hataları görmek için Kod
Editörleri (IDE / Text Editor) kullanılır.
💻 Editör Tercihi (Sublime Text, Notepad++, Visual Studio Code)
Kod editörleri yazdığınız kodun içeriğini veya çalışmasını
doğrudan etkilemez. Yalnızca kodu renkli göstererek okumanızı kolaylaştırır ve
otomatik tamamlama (autocomplete) özellikleri
sunarak hız kazandırır.
📁 İlk Web Klasörü Yapısı
Bir web projesine başlarken ilk kural, tüm dosyaları tek bir
ana klasör altında toplamaktır.
Kritik Kural: Tarayıcılar (Chrome, Safari, Edge), bir web klasörüne girdiğinde ilk olarak index.html
isimli dosyayı arar ve ana sayfa olarak onu çalıştırır.
🏗️ Konu 1: Web Sitesi
Kurmanın Temelleri — HTML
HTML (HyperText Markup Language), bir web sayfasının metin, görsel,
buton gibi ögelerini yerleştirdiğimiz bir işaretleme dilidir. Bir
programlama dili değildir, kendi başına mantıksal işlemler yapamaz.
🧱 Temel HTML İskeleti ve
Etiket Mantığı
HTML etiketleri genellikle <etiket_adı>
ile açılır ve </etiket_adı> ile kapatılır.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>İlk Web Sayfamız</title>
</head>
<body>
<!--
Kullanıcının web sitesinde göreceği her şey buraya yazılır -->
Dünyaya merhaba!
</body>
</html>
📝 Başlıklar (Heading) ve Alt Satıra Geçme (Break)
Web sitelerinde metin hiyerarşisi sağlamak için başlık
etiketleri kullanılır. <h1> ile <h6>
arasında 6 adet başlık seviyesi vardır. <h1> en
büyük ve en önemli başlıktır; <h6> ise en küçük başlıktır.
🚀 Uygulama 1: Başlıklar
ve Paragraflar
<h1>Yazılım Dünyasına
Giriş</h1>
<p>Web geliştirme öğrenmek
sabır ve pratik gerektiren keyifli bir süreçtir.</p>
<br>
<h2>HTML Nedir?</h2>
<p>HTML, sayfalarımızın temel
iskeletidir.<br>Bu cümleyi break etiketi ile
alt satıra indirdik.</p>
🎨 Yazı Formatları
Metin içerisindeki belirli kelimeleri vurgulamak veya
biçimlendirmek için özel etiketler kullanırız:
🚀 Uygulama 2:
Biçimlendirilmiş Metin
<p>Bu eğitimde <strong>Sıfırdan Web Tasarımı</strong>
öğreneceksiniz. Lütfen dersleri <em>not alarak</em> takip ediniz.</p>
💬 Yorum Satırı ve İpucu
Kutusu (Tooltip)
🚀 Uygulama 3: Yorum ve Tooltip Kullanımı
<!-- Menü Alanı
Başlangıcı -->
<p title="Bu
bir HTML niteliğidir (attribute)">Farenizi bu
yazının üzerinde bekletin.</p>
<!-- Menü Alanı Bitişi
-->
🔗 Bağlantı (Link) ve
Görsel (Image) Yönetimi
🚀 Uygulama 4: Resimli
Link ve Dış Bağlantı
Görselleri linklerin içerisine sararak tıklanabilir
resimler üretebiliriz.
<!-- Dış siteye giden
normal link -->
<a href="https://google.com"
target="_blank">Google'da
Ara</a>
<br><br>
<!-- Tıklanınca başka
sayfaya giden görsel -->
<a href="hakkimizda.html">
<img src="logo.png"
alt="Şirket Logosu" width="150">
</a>
📋 Listeler (Sıralı ve
Sırasız)
Web tasarımda menüler, kategoriler ve maddeli içerikler
listelerle oluşturulur.
🚀 Uygulama 5: Alışveriş
Listesi ve Web Sitesi Menüsü
<h3>Haftalık Alışveriş
Listesi</h3>
<ol>
<li>Süt</li>
<li>Ekmek</li>
</ol>
<h3>Web Sitesi Menü
Navigasyonu</h3>
<ul>
<li><a href="index.html">Ana
Sayfa</a></li>
<li><a href="hakkimizda.html">Hakkımızda</a></li>
<li><a href="iletisim.html">İletişim</a></li>
</ul>
📦 Bölümleme (Div) ve Form Elemanları
🚀 Uygulama 6: Temel Giriş
Formu ve Kapsayıcı Div
<div class="form-konteyner">
<h2>Kullanıcı Girişi</h2>
<form action="#" method="POST">
<label for="kullanici">Kullanıcı Adı:</label>
<input type="text" id="kullanici"
name="username" placeholder="Adınızı
giriniz...">
<br><br>
<label for="sifre">Şifre:</label>
<input type="password" id="sifre"
name="user_password">
<br><br>
<button type="submit">Giriş Yap</button>
</form>
</div>
📝 Pekiştirme Testi (HTML
Pratik Soruları)
Öğrendiğiniz HTML bilgilerini sınamak için aşağıdaki mini
senaryoları kendiniz yazmaya çalışın:
🎨 Konu 2: CSS'e İlk Adım ve Satır İçi (Inline)
CSS
CSS (Cascading Style Sheets), HTML ile kurduğumuz kuru iskeleti
renklendiren, boyutlandıran ve konumlandıran stil dilidir.
CSS'i HTML elementlerine doğrudan
uygulamanın en hızlı (ancak büyük projelerde tercih edilmeyen) yolu Inline (Satır İçi) CSS'tir. Elementin içerisine style="..." niteliği yazılarak uygulanır.
<!-- Satır içi stil
ile kırmızı, 20px boyutunda ve ortalanmış başlık -->
<h1 style="color: red; font-size: 20px; text-align: center;">Renkli
Başlık</h1>
Harika!
Temelleri sağlam attığımıza göre, şimdi web sitelerimizi gerçek birer görsel
şölene dönüştüreceğimiz ve yapısal düzeni kuracağımız Gelişmiş CSS Dünyası
ve ardından ilk gerçek projemiz olan Sıfırdan Portfolyo Sitesi
bölümlerine geçiyoruz.
Süre
ve önizleme gibi teknik kalabalıklar temizlenerek,
tamamen kod mantığına ve uygulamaya odaklanılmıştır.
🎨 Full Stack Web Tasarım ve Programlama Eğitimi: Bölüm 2
📐 Konu 1: CSS
Yapısı ve Seçiciler (Selectors)
Bir
önceki bölümde gördüğümüz Inline CSS,
her etikete tek tek yazıldığı için kod karmaşasına yol açar. Gerçek projelerde
stilleri merkezi bir yerden yönetmek için Internal
(İç) CSS veya en doğrusu olan External
(Dış) CSS kullanılır.
📌 CSS
Çeşitleri
<!-- Dış CSS dosyasını HTML'e bağlama kodu
(head içine yazılır) -->
<link rel="stylesheet" href="style.css">
🏷️ Kimlik
(ID) ve Sınıf (Class) Kavramları
CSS
ile HTML elementlerini seçip boyamak için iki temel ayırt edici nitelik
kullanırız:
🚀 Uygulama 1: Sınıf ve Kimlik
Yönetimi
HTML
Yapısı:
<p class="kirmizi-yazi">Ben kırmızı bir paragrafım.</p>
<p class="kirmizi-yazi">Ben de aynı sınıfa dahilim ve
kırmızıyım.</p>
<div id="ana-banner">Bu özel alanın tasarımı tektir.</div>
CSS
Yapısı (style.css):
/* Sınıf Seçici */
.kirmizi-yazi {
color:
#ff0000;
}
/* ID Seçici */
#ana-banner
{
background-color: #333;
color:
#fff;
padding:
20px;
}
🎨 Konu 2:
Renkler (HEX), Fontlar ve Metin Şekillendirme
🎨 Renk Seçimi
ve Önbellek (Çerez) Sorunu
Web
sitelerinde renkler çoğunlukla Onaltılık (HEX) kodlarla (Örn: #FFFFFF
beyaz, #000000
siyah) belirtilir. Tarayıcılarda Color Picker (Renk Seçici) araçlarını
kullanarak beğendiğiniz rengin HEX kodunu kopyalayabilirsiniz.
⚠️ Geliştirici Tuzağı (Önbellek): CSS dosyanızda değişiklik
yaptığınız halde tarayıcıda yenilediğinizde değişmiyorsa, tarayıcınız eski CSS
dosyasını çerezlerine (önbelleğe) atmış olabilir. Bu durumu aşmak için
tarayıcıyı Gizli Modda açabilir veya Ctrl + F5 kombinasyonu ile sayfayı
tamamen temizleyerek yenileyebilirsiniz.
✍️ Metin Biçimlendirme
Özellikleri
🚀 Uygulama 2: Metin Stil
Çalışması
body
{
font-family: 'Segoe
UI', Tahoma,
Geneva, Verdana, sans-serif;
}
h2
{
font-size: 28px;
color:
#2c3e50;
text-align:
center;
text-transform:
uppercase; /*
Tüm harfleri büyük yapar */
}
📦 Konu 3: CSS
Kutu Modeli (Box Model)
CSS
dünyasındaki her element, etrafında görünmez birer kutu barındırır. Web
sitelerinin yerleşim planı tamamen bu kutu modeline dayanır.
+-----------------------------------+
| Margin | <- Dış Boşluk
| +-------------------------+ |
| |
Border |
| <-
Çerçeve
| |
+---------------+ | |
| |
| Padding |
| | <- İç Boşluk
| |
| İçerik/Yazı | |
|
| |
+---------------+ | |
| +-------------------------+ |
+-----------------------------------+
🚀 Uygulama 3: Kutu Modeli
Oluşturma
Bir
web sitesi için şık bir buton veya kart (card) alanı
tasarlayalım:
HTML:
<div class="ozellik-kutusu">
<h3>Mobil Uyumlu</h3>
<p>Tasarımlarımız
tüm cihazlarda harika görünür.</p>
</div>
CSS:
.ozellik-kutusu {
width:
300px;
height:
auto;
background-color: #f8f9fa;
/*
Kutu Modeli Ayarları */
border:
2px solid #3498db; /* Kalınlık, Stil, Renk */
padding:
15px; /* Kutunun içindeki yazıların kenara sıkışmasını önler */
margin:
20px auto; /*
Üst-alttan 20px boşluk bırakır, sağ-soldan ortalar */
}
🧭 Konu 4:
Hizalama ve Element Düzeni (Display, Float, Combinators)
🧱 Display (Görünüm) Özelliği
🌊 Float ve Ortalamak (Aligning)
Eski
ve köklü projelerde elementleri yan yana dizmek için float: left; veya float: right; kullanılır. Blok düzeyindeki
bir elementi sayfada tam ortalamak içinse genişlik verip margin: 0 auto; kuralı uygulanır.
⛓️ Kombinasyon
Seçiciler (Combinators)
Elementlerin
birbiriyle olan hiyerarşik ilişkisine göre seçim yapmamızı sağlar.
🚀 Uygulama 4: CSS Tablo ve
Form Görselleştirme
Gelişmiş
bir form ve hiyerarşik seçici kullanımı gerçekleştirelim:
HTML:
<form class="kayit-formu">
<div
class="input-grup">
<input type="text" placeholder="Adınız">
</div>
<div
class="input-grup">
<input type="email" placeholder="E-posta Adresiniz">
</div>
</form>
CSS:
/* Sadece
.kayit-formu sınıfının içindeki inputları seç ve stillendir */
.kayit-formu .input-grup
input {
width:
100%;
padding:
10px;
margin-bottom:
10px;
border:
1px solid #ccc;
border-radius:
4px; /*
Köşeleri yumuşatır */
}
💼 Konu 5:
Sıfırdan Portfolyo Sitesi Projesi
Şu
ana kadar öğrendiğimiz HTML ve CSS mimarisini, sayfalar arası geçişi olan
gerçekçi bir 3 Sayfalı Portfolyo Sitesi üzerinde birleştirelim. Tasarım
harikası olmasından ziyade işlevselliğe ve sayfaların birbirine bağlanmasına
odaklanacağız.
🧱 Proje Dosya
Yapısı
Aşağıdaki
dosyaların tamamının masaüstünde oluşturduğunuz aynı web klasöründe olması
gerekir:
📄 Adım 1:
Ortak CSS Altyapısı (style.css)
Tüm
sayfaların menüsü ve genel düzeni bu dosyadan beslenecektir.
/* Genel Sıfırlama */
*
{
margin:
0;
padding:
0;
box-sizing:
border-box;
}
body
{
font-family: Arial, sans-serif;
line-height:
1.6;
background-color: #f4f4f4;
}
/* Navigasyon Menüsü
*/
nav {
background-color: #2c3e50;
padding:
15px;
}
nav ul {
list-style:
none;
text-align:
center;
}
nav ul li {
display:
inline-block;
margin:
0 15px;
}
nav ul li a {
color:
#fff;
text-decoration:
none;
font-weight: bold;
}
nav ul li a:hover {
color:
#1abc9c; /* Fare üzerine
gelince yeşile döner */
}
/* İçerik Alanı */
.icerik {
max-width:
800px;
margin:
30px auto;
background: #fff;
padding:
20px;
border-radius:
8px;
box-shadow:
0 0 10px rgba(0,0,0,0.1);
}
/* Form Elemanları */
.form-grup
{
margin-bottom:
15px;
}
.form-grup
label {
display:
block;
font-weight: bold;
}
.form-grup
input, .form-grup textarea
{
width:
100%;
padding:
8px;
margin-top:
5px;
}
button {
background-color: #2c3e50;
color:
white;
padding:
10px 15px;
border:
none;
cursor:
pointer;
}
button:hover {
background-color: #1abc9c;
}
🏠 Adım 2: Ana
Sayfa (index.html)
<!DOCTYPE
html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Portfolyom - Ana Sayfa</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<!--
Tüm Sayfalarda Ortak Olacak Menü -->
<nav>
<ul>
<li><a
href="index.html">Ana Sayfa</a></li>
<li><a
href="hakkimizda.html">Hakkımda</a></li>
<li><a
href="iletisim.html">İletişim</a></li>
</ul>
</nav>
<div
class="icerik">
<h1>Yazılım Geliştirici Portfolyosuna Hoş
Geldiniz</h1>
<p>Merhaba,
ben bir Full Stack Web Geliştirici adayıyım. Bu site
HTML ve CSS bilgilerimi pekiştirmek için yaptığım ilk dinamik geçişli projedir.</p>
</div>
</body>
</html>
🧑💻 Adım 3:
Hakkımızda Sayfası (hakkimizda.html)
<!DOCTYPE
html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Portfolyom - Hakkımda</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
<ul>
<li><a
href="index.html">Ana Sayfa</a></li>
<li><a
href="hakkimizda.html">Hakkımda</a></li>
<li><a
href="iletisim.html">İletişim</a></li>
</ul>
</nav>
<div
class="icerik">
<h2>Hakkımda</h2>
<p>Sıfırdan
başladığım bu serüvende HTML ve CSS adımlarını başarıyla tamamladım. Yakında
JavaScript, Bootstrap ve PHP öğrenerek tam donanımlı
projeler üretmeye başlayacağım.</p>
</div>
</body>
</html>
📞 Adım 4:
İletişim Sayfası (iletisim.html)
<!DOCTYPE
html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Portfolyom - İletişim</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
<ul>
<li><a
href="index.html">Ana Sayfa</a></li>
<li><a
href="hakkimizda.html">Hakkımda</a></li>
<li><a
href="iletisim.html">İletişim</a></li>
</ul>
</nav>
<div
class="icerik">
<h2>Bana Ulaşın</h2>
<!--
Mailto Özelliği: Gönder butonuna basınca bilgisayarın
e-posta uygulamasını açar -->
<p>Bana
doğrudan yazmak için <a href="mailto:ornek@eposta.com">ornek@eposta.com</a>
adresini kullanabilirsiniz.</p>
<br>
<form action="#" method="POST">
<div
class="form-grup">
<label>Adınız Soyadınız:</label>
<input type="text" required>
</div>
<div
class="form-grup">
<label>E-posta Adresiniz:</label>
<input type="email" required>
</div>
<div
class="form-grup">
<label>Mesajınız:</label>
<textarea rows="5" required></textarea>
</div>
<button type="submit">Mesajı Gönder</button>
</form>
</div>
</body>
</html>
Harika
ilerliyoruz! HTML ve CSS ile tasarımlarımızı oluşturup bir portfolyo projesine
dönüştürdük. Şimdi sırada, yazdığımız sitelerin akıllı telefon, tablet ve
masaüstü bilgisayarlarda kusursuz görünmesini sağlayacak olan Responsive Tasarım (Mobil Uyum) ve bu süreci
inanılmaz hızlandıran Bootstrap dünyası var.
Müfredattaki
süre ve ders sayısı gibi kalabalıklar temizlenmiş, tamamen modern web
standartlarına uygun kod mantığı ve canlı uygulamalar eklenmiştir.
📱 Full Stack Web Tasarım ve Programlama Eğitimi: Bölüm 3
📐 Konu 1: Responsive Tasarımın Temeli (Mobil Uyum)
Responsive Web Tasarım, bir web sitesinin ekran genişliğine göre kendi düzenini
otomatik olarak yeniden şekillendirmesidir. Masaüstünde yan yana duran 3 kutu,
ekranı küçük bir cep telefonunda alt alta dizilmelidir ki kullanıcı parmağıyla
ekranı sağa sola kaydırmak zorunda kalmasın.
🌐 Viewport Meta Etiketi
Mobil
uyumlu bir sitenin HTML sayfasında bulunması zorunlu olan en kritik kod, <head> etiketleri arasına yazılan Viewport kodudur. Bu kod, tarayıcıya sayfa
boyutlarını cihazın ekran genişliğine göre ayarlamasını söyler.
<!-- Bu kod yoksa, yazdığınız hiçbir mobil uyum kodu telefonda
çalışmaz -->
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
✂️ Medya
Sorguları (Media Queries)
CSS'te belirli ekran genişliklerine özel kurallar yazmak için @media kuralını kullanırız.
Örneğin: "Ekran genişliği 768 pikselden küçükse şu stilleri uygula"
diyebiliriz.
🚀 Uygulama 1: Ekran
Küçüldüğünde Değişen Menü ve İçerik
Masaüstünde
yan yana duran menü elemanlarını ve içerik bloklarını, ekran cep telefonu
boyutuna geldiğinde dikey (alt alta) hale getirelim.
HTML:
<div class="kapsayici">
<div
class="blok-sol">Sol Menü / İçerik</div>
<div
class="blok-sag">Ana İçerik Alanı</div>
</div>
CSS
(style.css):
/* Masaüstü Varsayılan
Tasarım */
.kapsayici {
display:
flex; /*
Elementleri yan yana dizmek için modern bir yöntem */
}
.blok-sol
{
width:
300px;
background-color: #34495e;
color:
white;
padding:
20px;
}
.blok-sag {
flex:
1; /* Kalan
tüm alanı kapla */
background-color: #ecf0f1;
padding:
20px;
}
/* --- MOBİL UYUM
ALANI (Ekran 768px veya daha küçükse) --- */
@media (max-width: 768px)
{
.kapsayici
{
flex-direction:
column; /*
Yan yana olan dizilimi ALT ALTA getirir */
}
.blok-sol, .blok-sag {
width:
100%; /* Her
iki blok da ekranın tamamını kaplasın */
margin-bottom:
10px;
}
}
⚡ Konu 2: Bootstrap Dünyası ve Kurulumu
Medya
sorgularıyla (@media)
her şeyi sıfırdan yazmak büyük projelerde çok zaman alır. Bootstrap,
Twitter mühendisleri tarafından geliştirilmiş, hazır CSS sınıfları barındıran
dünyanın en popüler Frontend (Ön Yüz)
Kütüphanesidir.
⚙️ Bootstrap Nasıl Kurulur?
Projeye
dahil etmenin en hızlı yolu CDN (Content Delivery Network) kullanmaktır.
Bilgisayarınıza hiçbir şey indirmeden, Bootstrap'in
sunucularındaki CSS dosyasını HTML sayfanıza bağlarsınız.
🚀 Uygulama 2: Bootstrap Destekli İlk Sayfa Şablonu
<!DOCTYPE
html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
<title>Bootstrap
Sitem</title>
<!--
Bootstrap CSS Bağlantısı (Güncel Sürüm) -->
<link href="https://jsdelivr.net" rel="stylesheet">
</head>
<body>
<div
class="container mt-5">
<h1 class="text-center text-primary">Bootstrap
Dünyasına Hoş Geldiniz!</h1>
<p
class="lead">Bu sayfadaki başlık rengi, ortalama ve bu yazı stili tamamen Bootstrap sınıfları ile yapılmıştır.</p>
</div>
<!--
Bootstrap JS (Menülerin açılması, slaytlar vb.
interaktif işler için) -->
<script src="https://jsdelivr.net"></script>
</body>
</html>
🧮 Konu 3: Bootstrap Grid (Izgara) Mantığı ve Sınıfları
Bootstrap'in kalbi Grid Sistemidir. Bootstrap,
bir satırı görünmez 12 eşit parçaya (kolona) böler. Siz tasarladığınız
elemente "Masaüstünde 4 parça kapla (yani yan yana 3 tane sığdır), mobilde
ise 12 parça kapla (tam ekran yap)" talimatını tek bir sınıf ismiyle
verirsiniz.
📐 Kolon Boyut
Sınıfları (Breakpoints)
🚀 Uygulama 3: Bootstrap Grid ile Mobil Uyumlu 3'lü Kart Tasarımı
Herhangi
bir CSS dosyası oluşturmadan, sadece Bootstrap
sınıflarını kullanarak masaüstünde yan yana 3 adet duran, mobilde ise otomatik
olarak alt alta dizilen bir hizmetler alanı yapalım.
<div class="container my-5">
<!--
row: Bir satır başlatır -->
<div
class="row">
<!--
Masaüstünde (lg) 12 parçanın 4'ünü kapla (12/4 = 3
sütun yan yana gelir) -->
<!--
Mobilde varsayılan olarak tam satırı kaplar -->
<div
class="col-lg-4
col-md-6 mb-4">
<div
class="card p-3 border shadow-sm bg-light">
<h3>Web Tasarım</h3>
<p>Modern
ve kurumsal web arayüz tasarımları yapıyoruz.</p>
</div>
</div>
<div
class="col-lg-4
col-md-6 mb-4">
<div
class="card p-3 border shadow-sm bg-light">
<h3>E-Ticaret</h3>
<p>Güvenli
ve satış odaklı sanal mağaza çözümleri.</p>
</div>
</div>
<div
class="col-lg-4
col-md-12 mb-4">
<div
class="card p-3 border shadow-sm bg-light">
<h3>SEO Optimizasyonu</h3>
<p>Google
aramalarında üst sıralara çıkmanızı sağlıyoruz.</p>
</div>
</div>
</div>
</div>
🍔 Konu 4:
Hazır Komponentler (Menü - Navbar
ve Slayt - Carousel)
Bootstrap'in en büyük avantajı, saatlerce sürecek olan açılır menü
(Hamburger Menu) ve görsel slayt (Slider) gibi
yapıları saniyeler içinde kurmanızı sağlamasıdır.
🚀 Uygulama 4:
Mobil Uyumlu Açılır Menü (Navbar) ve Slayt (Carousel)
Yapımı
Aşağıdaki
kodu HTML sayfanızın <body> etiketleri arasına yerleştirdiğinizde, ekran küçüldüğünde
otomatik olarak üç çizgi (hamburger ikonuna) dönüşen şık bir menü ve altında
dönen görseller elde edersiniz.
<!-- MOBİL UYUMLU BOOTSTRAP MENÜSÜ -->
<nav class="navbar navbar-expand-lg
navbar-dark bg-dark">
<div
class="container-fluid">
<a
class="navbar-brand" href="#">ŞirketLogosu</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div
class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-expand navbar-nav ms-auto">
<li class="nav-item"><a
class="nav-link active" href="#">Ana Sayfa</a></li>
<li class="nav-item"><a
class="nav-link" href="#">Hizmetler</a></li>
<li class="nav-item"><a
class="nav-link" href="#">İletişim</a></li>
</ul>
</div>
</div>
</nav>
<!-- BOOTSTRAP GÖRSEL SLAYTI (CAROUSEL) -->
<div id="anaSlayt" class="carousel slide
container mt-4" data-bs-ride="carousel">
<div
class="carousel-inner text-center bg-secondary text-white p-5 rounded">
<!--
1. Slayt -->
<div
class="carousel-item active">
<h2>Yaratıcı Çözümler</h2>
<p>Geleceğin
teknolojilerini bugünden inşa ediyoruz.</p>
</div>
<!--
2. Slayt -->
<div
class="carousel-item">
<h2>%100 Mobil Uyumlu</h2>
<p>Tüm
cihazlarda kesintisiz ve akıcı kullanıcı deneyimi.</p>
</div>
</div>
<!--
Slayt Kontrol Butonları -->
<button class="carousel-control-prev" type="button" data-bs-target="#anaSlayt" data-bs-slide="prev">
<span class="carousel-control-prev-icon"></span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#anaSlayt" data-bs-slide="next">
<span class="carousel-control-next-icon"></span>
</button>
</div>
🎨 Konu 5:
Kendi CSS Kodlarımızla Bootstrap'i Birlikte Kullanmak
Bootstrap bize harika bir zemin sunar ancak bazen markamızın tam renk
tonunu veya özel sınır çizgilerini eklemek isteriz. Bu durumda Bootstrap sınıflarının üzerine kendi CSS dosyamızı yazarız.
📌 Altın Kural: Kendi yazdığınız style.css dosyasının <link> etiketi, HTML sayfasında her
zaman Bootstrap CSS linkinin altında yer
almalıdır. Böylece tarayıcı önce Bootstrap'i okur,
ardından sizin özel kurallarınızla Bootstrap'in
üzerine yazar.
<!-- Önce ana kütüphane -->
<link href="https://jsdelivr.net" rel="stylesheet">
<!-- Sonra sizin özel tasarımlarınız -->
<link rel="stylesheet" href="style.css">
Harika
bir aşamaya geldik! Tasarımlarımızı HTML, CSS ve Bootstrap
ile tamamen bitirdik, mobil uyumlu hale getirdik. Şimdi ise web sitelerimize
gerçek bir akıl, mantık ve hareket katacağımız, tarayıcı tabanlı
dünyanın en popüler programlama dili olan JavaScript dünyasına adım
atıyoruz.
Müfredattaki
süreler, ders sayıları ve önizleme gibi teknik
kalabalıklar temizlenmiş; doğrudan mantığı kavratacak saf kod yapıları ve canlı
uygulamalar eklenmiştir.
🧠 Full Stack Web Tasarım ve Programlama Eğitimi: Bölüm 4
🕹️ Konu 1:
JavaScript Nedir ve Sayfaya Nasıl Dahil Edilir?
JavaScript
(JS); HTML
ile kurulan iskelete, CSS ile verilen estetiğe canlılık ve işlevsellik
kazandıran bir programlama dilidir. Örneğin bir butona tıklandığında sayfa
yenilenmeden bir kutunun açılması, form verilerinin kontrol edilmesi veya bir
matematiksel hesaplama yapılması tamamen JavaScript'in görevidir.
🔌 JavaScript
Kullanım Çeşitleri
<!-- Dış JavaScript dosyasını HTML'e
bağlama (Body kapanışından hemen önce yapılması önerilir) -->
<script src="script.js"></script>
🏗️ Konu 2:
HTML Elementlerine Erişim ve Dinamik Değişiklikler
JavaScript'in
en güçlü yanlarından biri, HTML üzerindeki elementleri yakalayıp içeriklerini
veya stillerini anlık olarak değiştirebilmesidir. Buna DOM (Document Object Model) Yönetimi denir.
🚀 Uygulama 1: Tıklama ile Yazı
Yerini Değiştirme ve Renklendirme
Bir
butona basıldığında sayfadaki iki paragrafın içeriğini yer değiştiren ve yazı
boyutunu/rengini dinamik olarak güncelleyen bir sistem kuralım.
HTML:
<p id="paragraf1">Ben birinci paragrafım (Başta
buradayım).</p>
<p id="paragraf2">Ben ikinci paragrafım (Ben de
buradayım).</p>
<!-- onclick: Butona tıklandığında
çalışacak JavaScript fonksiyonunu tetikler -->
<button onclick="metniDegistir()">İçerikleri Değiştir ve Süsle</button>
JavaScript
(script.js):
function metniDegistir() {
//
1. Elementleri ID'leri üzerinden hafızaya alıyoruz
var
p1 = document.getElementById("paragraf1");
var
p2 = document.getElementById("paragraf2");
//
2. Birinci paragrafın eski değerini kaybolmasın diye geçici bir kutuda
saklıyoruz
var
geciciKutu = p1.innerHTML;
//
3. Değerleri birbiriyle değiştiriyoruz (innerHTML
kullanarak)
p1.innerHTML =
p2.innerHTML;
p2.innerHTML = geciciKutu;
//
4. Stil Değişimi (.style
özellikleri ile dinamik müdahale)
p1.style.color = "blue";
p1.style.fontSize
= "24px";
p2.style.color = "red";
p2.style.fontSize
= "18px";
}
🧮 Konu 3:
JavaScript ile Programlama Temelleri
Yazılım
dünyasının evrensel kuralları olan değişkenler, diziler ve döngüler mantığını
JavaScript üzerinde uygulayalım.
📦 Değişkenler
ve Matematiksel İşlemler
Değişkenler,
içerisinde veri (sayı, metin vb.) sakladığımız dijital kutulardır. Günümüz
JavaScript standartlarında var, let veya const anahtar kelimeleriyle tanımlanırlar.
let x = 7;
let y = 4;
let sonuc = x * y; // Sonuç 28 olacaktır
console.log(sonuc); //
Tarayıcının incele/konsol ekranına yazdırır
🗃️ Diziler (Arrays)
Birden
fazla veriyi tek bir değişken altında, listeli bir şekilde saklamak için
diziler kullanılır. Elemanlara erişirken saymaya 0'dan başlanır.
let arabalar = ["BMW", "Mercedes", "Audi"];
console.log(arabalar[0]); // Ekrana "BMW" yazar
🛣️ Koşullu
İfadeler (if - else) ve Mantıksal Operatörler
Belirli
şartlara göre kodun akışını değiştirmemizi sağlar.
🚀 Uygulama 2: Kullanıcı
Girdili Sayı Tahmin Oyunu
Kullanıcıdan
input ve buton aracılığıyla bir sayı alalım, doğru sayıyla
karşılaştırıp yönlendirme yapalım.
HTML:
<h3>Sayı Tahmin Oyunu (1-10
Arası)</h3>
<input type="number" id="kullaniciTahmini" placeholder="Tahmininiz...">
<button onclick="tahminKontrol()">Tahmin Et</button>
<p id="oyunMesaji"></p>
JavaScript:
let gizliSayi = 7; //
Doğru tahmin edilmesi gereken sayı
function tahminKontrol() {
//
.value ile input
elementinin içine yazılan değeri çekiyoruz
let tahmin = document.getElementById("kullaniciTahmini").value;
let mesajAlani = document.getElementById("oyunMesaji");
if (tahmin == gizliSayi)
{
mesajAlani.innerHTML
= "🎉 Tebrikler! Doğru bildiniz.";
mesajAlani.style.color
= "green";
} else if
(tahmin < gizliSayi
&& tahmin > 0) {
mesajAlani.innerHTML
= "📈 Biraz daha BÜYÜK bir sayı deneyin.";
mesajAlani.style.color
= "orange";
} else if
(tahmin > gizliSayi
&& tahmin <= 10) {
mesajAlani.innerHTML
= "📉 Biraz daha KÜÇÜK bir sayı deneyin.";
mesajAlani.style.color
= "orange";
} else {
mesajAlani.innerHTML
= "⚠️ Lütfen 1 ile 10 arasında geçerli bir sayı girin!";
mesajAlani.style.color
= "red";
}
}
🔄 Konu 4:
Döngüler (for, while) ve Fonksiyonlar
🔁 Döngü
Mantığı
Aynı
işlemi defalarca tekrarlamak yerine döngüleri kullanırız.
🚀 Uygulama 3: Karekök
Hesaplayıcı Fonksiyon
Dışarıdan
parametre alıp çalışan ve döngüsel/matematiksel işlemler yapan gelişmiş bir
fonksiyon kuralım.
// Kendisine
gönderilen sayının karekökünü hesaplayan fonksiyon
function karekokHesapla(sayi) {
//
Math.sqrt hazır JavaScript matematik kütüphanesidir
if (sayi >= 0)
{
return Math.sqrt(sayi);
} else {
return "Negatif
sayıların karekökü reel sayılarda hesaplanamaz.";
}
}
// Kullanımı:
let donenSonuc = karekokHesapla(25);
console.log(donenSonuc); //
Konsola 5 yazar.
⚙️ Konu 5: Yok
Olan Daireler Projesi (Bonus Etkinlik)
JavaScript
ile web sayfasına nasıl görsel animasyon ve etkileşim katacağımızı göstermek
adına, tıklandığında ekrandan kaybolan kutular/daireler uygulaması yapalım.
HTML:
<div class="daire" id="daire1" onclick="yokEt('daire1')"></div>
<div class="daire" id="daire2" onclick="yokEt('daire2')"></div>
CSS:
.daire
{
width:
100px;
height:
100px;
background-color: red;
border-radius:
50%; /*
Kareyi tam daire yapar */
display:
inline-block;
margin:
20px;
cursor:
pointer;
transition:
opacity 0.5s; /*
Yumuşak kaybolma efekti */
}
JavaScript:
function yokEt(daireId) {
//
Tıklanan daireyi ID'sine göre yakalayıp görünmez
yapıyoruz
document.getElementById(daireId).style.display = "none";
}
Harika
bir adıma geldik! Saf JavaScript (Vanilla JS) ile
tarayıcı elementlerine nasıl hükmedeceğimizi ve kodlama mantığını kavradık.
Şimdi ise bu uzun JavaScript kodlarını çok daha kısa, pratik ve okunabilir hale
getiren, yıllardır web dünyasının vazgeçilmezi olan jQuery
kütüphanesini ve onunla yapacağımız İnteraktif Form Doğrulama projesini
ele alıyoruz.
Müfredattaki
süreler, ders sayıları ve önizleme gibi teknik
detaylar temizlenmiş; tamamen modern web geliştirme pratikleri, Regex doğrulama mantığı ve pratik uygulamalar eklenmiştir.
🚀 Full Stack Web Tasarım ve Programlama Eğitimi: Bölüm 5
🔌 Konu 1: jQuery Nedir ve Kurulumu Nasıl Yapılır?
jQuery, "Daha Az Kod Yaz, Daha
Çok İş Yap" (Write Less, Do More) felsefesiyle geliştirilmiş bir JavaScript
kütüphanesidir. Saf JavaScript ile 5-6 satır süren element seçme, animasyon
ekleme ve olay (event) yönetimi işlemlerini, jQuery tek bir satırda çözebilir.
🛠️ jQuery Projeye Nasıl Dahil Edilir?
jQuery'yi kullanmak için jquery.com üzerinden indirip lokal olarak projenize ekleyebilir (embed) veya CDN (sunucu bağlantısı) ile projenize
anında dahil edebilirsiniz.
📌 Kritik Kural: jQuery
kodlarınızın çalışabilmesi için, kendi yazdığınız script.js dosyasından ÖNCE jQuery kütüphane linkinin HTML sayfasına eklenmesi şarttır.
<!-- 1. Önce jQuery Kütüphanesi Bağlantısı
(Body kapanışından hemen önce) -->
<script src="https://jquery.com"></script>
<!-- 2. Sonra Sizin Yazacağınız Özel Kod Dosyanız -->
<script src="script.js"></script>
⚡ Konu 2: jQuery ile Element Yakalama, Tıklama Tespiti ve
Animasyonlar
JavaScript'teki
document.getElementById veya querySelector uzun yapıları yerine, jQuery'de
elementleri CSS seçici mantığıyla $() sembolü içinde çok hızlıca yakalarız.
🎭 Temel
Fonksiyonlar ve Olaylar
🚀 Uygulama 1: jQuery ile Hızlı Animasyon ve Stil Yönetimi
Bir
butona tıklandığında kutunun yumuşakça kaybolmasını, diğerine tıklandığında ise
kutunun renginin değişip büyümesini sağlayalım.
HTML:
<button id="btnGizle">Kutuyu Gizle</button>
<button id="btnBuyut">Kutuyu Değiştir</button>
<div id="testKutusu" style="width:100px; height:100px; background-color:red;
margin-top:20px;"></div>
JavaScript
(script.js - jQuery
Destekli):
// Sayfa tamamen
yüklendiğinde kodların çalışmaya hazır olmasını sağlar
$(document).ready(function() {
//
Tıklama tespiti ve Gizleme Animasyonu
$("#btnGizle").click(function() {
//
Kutuyu 700 milisaniyede yumuşakça yok et (fadeOut)
$("#testKutusu").fadeOut(700);
});
//
Stil Değişikliği ve Gelişmiş Animasyon
$("#btnBuyut").click(function() {
//
.css kullanımı ile anlık renk değişimi
$("#testKutusu").css("background-color", "blue");
// .animate kullanımı ile genişlik
ve yükseklik değişimi
$("#testKutusu").animate({
width: "200px",
height: "200px"
}, 500); //
500 milisaniyede tamamla
});
});
💼 Konu 3: jQuery Projesi — İnteraktif Form Doğrulama
Kullanıcıların
formları boş bırakmasını engellemek, e-posta adreslerinin gerçek bir e-posta
formatında olup olmadığını (@ ve .
işareti içeriyor mu) kontrol etmek ve şifre
güvenliğini tarayıcı tarafında doğrulamak için harika bir interaktif form
projesi inşa edelim.
🧱 Adım 1:
HTML Form Yapısının Oluşturulması
<div class="form-konteyner" style="max-width:400px; margin:50px auto;
font-family:Arial;">
<h2>Kayıt Ol</h2>
<form id="kayitFormu">
<div
style="margin-bottom:15px;">
<input type="text" id="isim" placeholder="Adınız Soyadınız" style="width:100%; padding:10px;">
<span class="hata" id="isimHata" style="color:red; display:none;">Bu alan boş bırakılamaz!</span>
</div>
<div
style="margin-bottom:15px;">
<input type="text" id="email" placeholder="E-posta Adresiniz" style="width:100%; padding:10px;">
<span class="hata" id="emailHata" style="color:red; display:none;">Geçersiz e-posta adresi!</span>
</div>
<div
style="margin-bottom:15px;">
<input type="password" id="sifre" placeholder="Şifreniz (En az 6 karakter)" style="width:100%; padding:10px;">
<span class="hata" id="sifreHata" style="color:red; display:none;">Şifre en az 6
karakter olmalıdır!</span>
</div>
<button type="submit" style="width:100%; padding:10px; background:#2c3e50; color:#fff; border:none;
cursor:pointer;">Kayıt İşlemini Tamamla</button>
</form>
<div
id="basariMesaji" style="margin-top:20px; color:green; display:none; font-weight:bold; text-align:center;">
🎉 Form başarıyla doğrulandı ve
gönderilmeye hazır!
</div>
</div>
🧠 Adım 2: jQuery ile Doğrulama Scriptinin
Yazılması (Regex ve Input
Kontrolleri)
Bu
adımda kullanıcının verilerini anlık inceleyeceğiz. E-posta kontrolü için Regex (Düzenli İfadeler) adı verilen evrensel
metin şablonu doğrulama fonksiyonunu kullanacağız.
$(document).ready(function() {
//
E-posta formatının geçerli olup olmadığını kontrol eden Regex
fonksiyonu
function emailGecerliMi(emailAdresi) {
var
regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
return regex.test(emailAdresi);
}
//
Form gönderilmeye çalışıldığında (submit anı) devreye
giren olay
$("#kayitFormu").submit(function(olay) {
//
Formun sayfayı varsayılan olarak yenilemesini engelliyoruz
olay.preventDefault();
//
Her submit işleminde önce hata mesajlarını gizleyelim
$(".hata").hide();
$("#basariMesaji").hide();
//
Input değerlerini alıyoruz (.val() fonksiyonu ile)
var
isimDeger = $("#isim").val().trim(); // .trim() sağ ve soldaki gereksiz boşlukları siler
var
emailDeger = $("#email").val().trim();
var
sifreDeger = $("#sifre").val();
var
formHatali = false;
//
1. Boş Input Tespiti (İsim Alanı)
if (isimDeger ===
"") {
$("#isimHata").fadeIn(); // Hata mesajını yumuşakça göster
formHatali = true;
}
//
2. E-mail Geçerliliği Kontrolü
if (emailDeger
=== "" || !emailGecerliMi(emailDeger)) {
$("#emailHata").fadeIn();
formHatali = true;
}
//
3. Şifre Uzunluğu Kontrolü
if (sifreDeger.length
< 6) {
$("#sifreHata").fadeIn();
formHatali = true;
}
//
Eğer hiçbir hata yoksa form başarıyla gönderilebilir durumdadır
if (formHatali
=== false) {
$("#basariMesaji").slideDown(); // Başarı mesajını yukarıdan aşağı kaydırarak göster
// Gerçek senaryoda burada veriler arka yüze (PHP) gönderilir
// this.submit();
kuralı tetiklenebilir.
}
});
});
Harika!
Ön yüz (Frontend) teknolojilerini eksiksiz
tamamladık. Artık kullanıcı tarafında çalışan sitelerimize, sunucu tarafında
güç vereceğimiz, verileri işleyeceğimiz ve web sitelerini tamamen canlı ve
dinamik hale getireceğimiz Backend (Arka
Yüz) dünyasına adım atıyoruz.
İlk
durağımız sunucu tarafının efsane dili PHP ve yerel sunucu ortamımız
olan XAMPP. Süreler ve gereksiz metinler temizlenmiş, tamamen kod ve
mantık odaklı rehberimiz hazırlanmıştır.
🐘 Full Stack Web Tasarım ve Programlama Eğitimi: Bölüm 6
🌐 Konu 1: PHP
Nedir ve Yerel Sunucu (XAMPP) Kurulumu
PHP
(Hypertext Preprocessor), sunucu tarafında çalışan (server-side) dinamik bir programlama dilidir. HTML veya
JavaScript gibi tarayıcıda doğrudan çalışmaz; kodlar önce sunucuda işlenir,
tarayıcıya sadece saf HTML sonucu gönderilir. Kullanıcılar sitenizin kaynak
koduna sağ tıklayıp "İncele" dediğinde PHP kodlarınızı asla göremez.
💻 Yerel
Sunucu Kurulumu (XAMPP)
Bilgisayarımızı
bir web sunucusuna dönüştürmek ve PHP kodlarını çalıştırabilmek için XAMPP
yazılımını kullanırız. XAMPP bize PHP motorunu ve MySQL veritabanını bir arada sunar.
🏗️ Konu 2:
PHP Temelleri (Echo, Değişkenler ve Diziler)
🔏 PHP Yazım
Kuralı (Syntax)
PHP
kodları mutlaka <?php etiketi ile başlar ve ?> etiketi ile biter. Her kod
satırının sonuna noktalı virgül (;)
koymak zorunludur.
📢 Ekrana
Yazdırma (echo)
Ekrana
metin veya HTML çıktısı vermek için echo komutu kullanılır.
<?php
echo
"<h1>PHP Dünyasına Merhaba!</h1>";
?>
📦 PHP'de Değişkenler
PHP'de değişkenler dolar ($) işareti ile tanımlanır.
JavaScript'teki gibi let veya var
yazılmaz. Harf veya alt çizgi ile başlamalıdır, sayı ile başlayamaz.
<?php
$isim = "Ahmet";
$yas = 25;
$boy = 1.78;
// Metin birleştirme işlemi nokta (.) işareti
ile yapılır
echo
"Merhaba, benim adım " . $isim . " ve
ben " . $yas . "
yaşındayım.";
?>
🗃️ PHP'de Diziler (Arrays)
Veri
gruplarını listelemek için kullanılır. Çağrılırken indeks sırası (0, 1, 2...)
esas alınır.
<?php
$kurslar = array("HTML",
"CSS", "JavaScript", "PHP");
// İkinci elemanı (CSS) ekrana yazdıralım
echo
"Öğrenilen Kurs: " . $kurslar[1];
?>
🛣️ Konu 3:
Koşullu İfadeler, Döngüler ve Dosya Dahil Etme (include)
🔄 Döngüler (for ve foreach)
PHP'de dizilerle çalışırken en çok tercih edilen döngü foreach döngüsüdür. Listenin içindeki tüm elemanları sırayla döner.
<?php
$sehirler = array("İstanbul",
"Ankara", "İzmir");
// Dizideki her şehri liste elemanı olarak
ekrana basalım
echo
"<ul>";
foreach
($sehirler as $sehir) {
echo
"<li>" . $sehir . "</li>";
}
echo
"</ul>";
?>
🧩 include Fonksiyonunun Gücü
Bir
web sitesi yaparken menü (header), alt alan (footer) veya yan alan (sidebar)
gibi her sayfada tekrar eden bölgeler vardır. Bunları her HTML sayfasına tek
tek kopyalamak yerine, ayrı birer PHP dosyasında tutup include fonksiyonu ile tek satırda çağırırız. Böylece menüde bir
değişiklik yapacağımızda 50 sayfayı değil, sadece header.php dosyasını değiştiririz.
🚀 Uygulama 1: Parçalı Sayfa
Yapısı Kurma
Bir header.php oluşturun:
<!-- header.php dosya içeriği -->
<nav>
<a href="index.php">Ana
Sayfa</a> | <a href="hakkimizda.php">Hakkımızda</a>
</nav>
<hr>
Ardından
bu menüyü index.php içinde tek satırda çağırın:
<!-- index.php dosya içeriği -->
<?php
// Menüyü bu sayfaya dahil ediyoruz
include
"header.php";
?>
<h1>Ana Sayfaya Hoş Geldiniz</h1>
<p>Bu alan ana sayfa içeriğidir.</p>
📥 Konu 4:
Sunucuya Veri Gönderme Metotları (GET ve POST)
Kullanıcıların
formlara yazdığı bilgileri veya tıkladığı linklerdeki verileri PHP sunucusuna
iletmenin iki temel yolu vardır: GET ve POST.
🔗 1. GET
Metodu
Verileri
URL adresi üzerinden (tarayıcı çubuğunda görünecek şekilde) gönderir. Güvenlik
gerektirmeyen arama butonları veya kategori tıklamalarında tercih edilir.
🚀 Uygulama 2: URL'den Gelen
Parametreleri Yakalamak
<?php
// URL'de "kategori" adında bir
parametre var mı diye kontrol ediyoruz
if
(isset($_GET['kategori'])) {
$gelenKategori
= $_GET['kategori'];
echo
"Şu an görüntülenen kategori: " . $gelenKategori;
} else {
echo
"Lütfen bir kategori seçiniz.";
}
?>
Tarayıcıda
http://localhost/index.php?kategori=Yazilim yazarak test ettiğinizde
ekrana kategori adını basacaktır.
🔒 2. POST
Metodu
Verileri
arka planda, tarayıcı çubuğunda gizleyerek sunucuya gönderir. Şifreler, kişisel
bilgiler, form mesajları kesinlikle POST metodu ile gönderilmelidir.
URL'de görünmez ve veri sınırı yoktur.
🚀 Uygulama 3: POST ile
Gönderilen Form Verilerini İşlemek
Hem
HTML formunu hem de bu formu karşılayıp işleyen PHP kodunu tek bir dosyada
birleştirelim.
<?php
// Eğer form butonuna basılmışsa (POST isteği
gelmişse) kodları çalıştır
if
($_SERVER["REQUEST_METHOD"] == "POST") {
// Formdaki inputların
'name' niteliklerine göre verileri alıyoruz
$kullaniciAdi =
$_POST['username'];
$mesaj = $_POST['user_message'];
// Basit bir güvenlik temizliği (boş mu
kontrolü)
if
(!empty($kullaniciAdi)
&& !empty($mesaj)) {
echo
"<div style='color:green;
padding:10px; background:#e1f5fe;'>";
echo
"<h3>Mesaj Alındı!</h3>";
echo
"Sayın <strong>" . $kullaniciAdi .
"</strong>, mesajınız sunucuya ulaştı: " . $mesaj;
echo
"</div><br>";
} else {
echo
"<p style='color:red;'>Lütfen
tüm alanları doldurun!</p>";
}
}
?>
<!-- HTML Form Alanı -->
<!-- action="" bırakılırsa form
veriyi kendi olduğu sayfaya POST eder -->
<form action="" method="POST">
<label>Adınız:</label><br>
<input
type="text"
name="username" required><br><br>
<label>Mesajınız:</label><br>
<textarea
name="user_message" required></textarea><br><br>
<button
type="submit">Gönder</button>
</form>
Harika
bir dönüm noktasına geldik! PHP dili ile sunucu tarafında mantıksal işlemler
yapmayı, formlardan gelen GET ve POST
verilerini yakalamayı öğrendik. Ancak şu ana kadar işlediğimiz veriler sayfa
yenilendiğinde veya tarayıcı kapandığında kayboluyordu.
Şimdi,
verileri kalıcı olarak tablolarda saklayacağımız, modern web sitelerinin
hafızası olan MySQL Veritabanı dünyasına adım
atıyoruz. Bu bölümde CRUD (Create, Read, Update, Delete) yani Veri Ekleme, Okuma, Güncelleme ve Silme
işlemlerinin tamamını kod örnekleriyle inşa edeceğiz.
🗄️ Full Stack Web Tasarım ve Programlama Eğitimi: Bölüm 7
📂 Konu 1:
MySQL Nedir ve phpMyAdmin Ortamı
MySQL, verileri satırlar ve
sütunlar halinde tablolarda saklayan ilişkisel bir veritabanı
yönetim sistemidir. XAMPP içinde hazır olarak gelir.
🛠️ Veritabanı ve Tablo Oluşturma Adımları
🔌 Konu 2: PHP
ile MySQL Arasında Veritabanı Bağlantısı Kurmak
(Connect)
PHP
ile veritabanı arasında güvenli bir köprü kurmak için
modern web standartı olan PDO (PHP Data Objects)
mimarisini kullanacağız.
🚀 Uygulama 1: baglan.php Dosyasının Hazırlanması
Projemizdeki
tüm veritabanı işlemlerinde bu bağlantı dosyasını include ederek kullanacağız.
<?php
$host = "localhost";
$db_adi = "kurumsal_db";
$kullanici= "root"; //
XAMPP varsayılan kullanıcı adı
$sifre = ""; // XAMPP varsayılan şifresi boştur
try {
// PDO nesnesi oluşturarak bağlantıyı
başlatıyoruz
$baglanti = new PDO("mysql:host=$host;dbname=$db_adi;charset=utf8",
$kullanici, $sifre);
// Hata yönetim modunu aktif ediyoruz
$baglanti->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
// Test amaçlı (Geliştirme aşaması
bittiğinde bu satır silinebilir)
// echo "Veritabanı bağlantısı başarıyla kuruldu!";
}
catch (PDOException
$hata) {
// Bağlantıda hata oluşursa çalışacak alan
die("Veritabanı bağlantı hatası:
" . $hata->getMessage());
}
?>
📝 Konu 3: Veritabanına Veri Ekleme (INSERT) ve Güvenli Veri Alımı
Kullanıcıdan
form aracılığıyla aldığımız verileri veritabanına
kaydetme işlemidir. SQL Injection adı verilen siber
saldırılardan korunmak için verileri doğrudan SQL sorgusunun içine yazmak
yerine Prepare (Hazırlık) mimarisiyle
güvenli hale getirmeliyiz.
🚀 Uygulama 2: Üye Kayıt Formu
ve Veritabanına Ekleme İşlemi
<?php
//
Önce veritabanı bağlantı dosyamızı çağırıyoruz
include "baglan.php";
if ($_SERVER["REQUEST_METHOD"] ==
"POST") {
$gelenIsim = $_trim($_POST['isim']);
$gelenEmail = $_trim($_POST['email']);
if
(!empty($gelenIsim)
&& !empty($gelenEmail))
{
// --- ÇOKLU VERİ GİRİŞİNİN ÖNLENMESİ
& ÖNCELİKLİ KONTROL ---
// Aynı e-posta adresiyle daha önce
kayıt olunmuş mu bakıyoruz
$kontrolSorgusu
= $baglanti->prepare("SELECT * FROM uyeler WHERE email = ?");
$kontrolSorgusu->execute([$gelenEmail]);
if
($kontrolSorgusu->rowCount()
> 0) {
echo "<p style='color:red;'>Bu e-posta adresi zaten sistemde
kayıtlı!</p>";
} else {
// E-posta benzersiz ise kayıt
işlemine geçiyoruz
// Soru işaretleri (?) dışarıdan
gelecek tehlikeli verileri maskeler
$sorgu = $baglanti->prepare("INSERT
INTO uyeler (isim, email)
VALUES (?, ?)");
$ekle = $sorgu->execute([$gelenIsim, $gelenEmail]);
if ($ekle) {
echo "<p style='color:green;'>🎉 Üye veritabanına
başarıyla kaydedildi!</p>";
}
}
} else {
echo
"<p style='color:red;'>Lütfen
tüm alanları doldurun.</p>";
}
}
?>
<!-- HTML Formu -->
<form action="" method="POST">
<input
type="text"
name="isim" placeholder="Adınız
Soyadınız" required><br><br>
<input
type="email"
name="email" placeholder="E-posta
Adresiniz" required><br><br>
<button
type="submit">Kayıt
Ol</button>
</form>
🔍 Konu 4: Veritabanındaki Verilerin Listelenmesi (SELECT & FETCH)
Veritabanında biriken verileri çekip web sayfamızda HTML tabloları veya
listeleri halinde son kullanıcıya gösterme işlemidir.
🚀 Uygulama 3: Üye Listesi
Tablosu Yapımı
<?php
include "baglan.php";
//
uyeler tablosundaki tüm verileri seçiyoruz
$sorgu
= $baglanti->query("SELECT * FROM uyeler",
PDO::FETCH_ASSOC);
?>
<h3>Kayıtlı Üyeler Listesi</h3>
<table border="1"
cellpadding="10" cellspacing="0">
<tr>
<th>ID</th>
<th>İsim</th>
<th>E-posta</th>
<th>İşlemler</th>
</tr>
<?php
// fetch() veya foreach ile gelen verileri
satır satır döndürüyoruz
foreach
($sorgu as $satir) {
?>
<tr>
<td><?php echo $satir['id']; ?></td>
<td><?php echo $satir['isim']; ?></td>
<td><?php echo $satir['email']; ?></td>
<td>
<!--
GET Metodunun Yaygın Kullanımı: ID parametresini linkle gönderiyoruz -->
<a href="sil.php?id=<?php echo $satir['id'];
?>" onclick="return
confirm('Silmek istediğinize emin
misiniz?')">Sil</a>
</td>
</tr>
<?php
}
?>
</table>
🛑 Konu 5:
Veri Silme (DELETE) ve Güncelleme (UPDATE) İşlemleri
🗑️ 1. Veri
Silme İşlemi
Yukarıdaki
tablodan gelen id
parametresini yakalayarak veritabanından ilgili
satırı tamamen silen sil.php dosyasını hazırlayalım.
🚀 Uygulama 4: sil.php Kod Yapısı
<?php
include "baglan.php";
//
Link üzerinden gelen bir ID var mı kontrol ediyoruz
if (isset($_GET['id']))
{
$silinecekID =
$_GET['id'];
// Sadece gelen ID'ye
ait satırı silmek için WHERE koşulu şarttır!
$silSorgusu = $baglanti->prepare("DELETE FROM uyeler WHERE id
= ?");
$durum = $silSorgusu->execute([$silinecekID]);
if
($durum) {
// Silme işlemi bitince kullanıcıyı
otomatik ana listeye geri yönlendirir
header("Location: liste.php");
exit;
}
}
?>
📝 2. Veri
Güncelleme İşlemi
Var
olan bir veriyi değiştirmek için UPDATE komutu kullanılır.
//
Örnek Güncelleme Sorgu Mimarisi
$guncelleSorgu = $baglanti->prepare("UPDATE
uyeler SET isim = ? WHERE id = ?");
$guncelleSorgu->execute(["Yeni İsim Değeri", 1]); // ID'si
1 olan üyenin ismini değiştirir
🔑 Konu 6:
Oturum Yönetimi (SESSION) ve Çerezler (COOKIES)
⚠️ Önemli Kural: PHP'de
SESSION yapılarını kullanabilmek
için, sayfanın en üstünde, henüz hiçbir HTML kodu başlamadan önce mutlaka session_start(); fonksiyonu tetiklenmelidir.
Eğitim
serüvenimizin en heyecanlı ve en büyük aşamasına geldik! Şu ana kadar parça
parça öğrendiğimiz tüm Frontend (HTML, CSS, Bootstrap) ve Backend (PHP,
MySQL, Session, Güvenlik) bilgilerimizi tek bir çatı
altında birleştiriyoruz.
Müfredat
doğrultusunda, odağımızı PHP/MySQL mimarisinden uzaklaştırmamak adına ön yüz
animasyonları için saf JavaScript kalabalığına girmeden, tamamen Bootstrap esnekliği ve PHP sunucu gücüyle
çalışan dinamik, yönetim panelli gerçek bir Blog Sitesi Projesi inşa
ediyoruz.
📝 Full Stack Web Tasarım ve Programlama Eğitimi: Büyük Final
Projesi
📁 Proje Dosya
Yapısı ve Planlama
Projemizi
modüler (parçalı) ve temiz kodlama mimarisine uygun olarak tasarlıyoruz. C:\xampp\htdocs\blog_projesi\ klasörü altında şu dosyaları
oluşturun:
🗄️ Adım 1: Veritabanı Mimarisinin Kurulması
phpMyAdmin paneline girerek blog_db adında bir veritabanı oluşturun
ve içerisine aşağıdaki iki tabloyu ekleyin:
🔌 Adım 2:
Çekirdek Kodlar (baglan.php ve header.php)
🧷 Veritabanı Bağlantısı (baglan.php)
<?php
try {
$baglanti = new PDO("mysql:host=localhost;dbname=blog_db;charset=utf8",
"root", "");
$baglanti->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
die("Bağlantı başarısız: " . $e->getMessage());
}
?>
🍔 Ortak Menü
ve Bootstrap Altyapısı (header.php)
Oturum
kontrollerini de sağlayan, tüm sayfalara dahil edeceğimiz dinamik menümüz:
<?php
if (session_status()
=== PHP_SESSION_NONE) {
session_start();
// Oturum yönetimini başlatıyoruz
}
?>
<!DOCTYPE
html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta
name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dinamik
PHP Blog</title>
<!-- Bootstrap CDN -->
<link href="https://jsdelivr.net" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body class="bg-light">
<nav class="navbar navbar-expand-lg navbar-dark bg-dark
mb-4">
<div class="container">
<a class="navbar-brand fw-bold" href="index.php">🚀 TeknoBlog</a>
<div class="navbar-nav ms-auto">
<a class="nav-item nav-link" href="index.php">Ana Sayfa</a>
<?php if(isset($_SESSION['admin_giris'])): ?>
<!--
Sadece admin giriş yaptıysa görünecek linkler -->
<a class="nav-item nav-link text-warning" href="olustur.php">+
Yeni Yazı Ekle</a>
<a class="nav-item nav-link text-danger" href="cikis.php">Çıkış
Yap</a>
<?php else: ?>
<a class="nav-item nav-link" href="giris.php">Yönetici Girişi</a>
<?php endif; ?>
</div>
</div>
</nav>
🔒 Adım 3:
Admin Giriş Sistemi ve Güvenlik (giris.php)
Yetkisiz
kişilerin blogunuza yazı yazmasını engellemek için SESSION kontrollü giriş ekranı
hazırlıyoruz.
<?php
include "baglan.php";
include "header.php";
if ($_SERVER["REQUEST_METHOD"] ==
"POST") {
$kadi = $_POST['kullanici'];
$sifre = $_POST['sifre'];
$sorgu = $baglanti->prepare("SELECT
* FROM admin WHERE kullanici_adi = ? AND sifre = ?");
$sorgu->execute([$kadi, $sifre]);
if
($sorgu->rowCount() > 0) {
$_SESSION['admin_giris']
= $kadi; // Oturumu başlat
header("Location: olustur.php"); // Gönderi oluşturma sayfasına
yönlendir
exit;
} else {
echo
"<div class='container'><div
class='alert alert-danger'>Hatalı kullanıcı adı veya
şifre!</div></div>";
}
}
?>
<div class="container" style="max-width: 400px; margin-top:
100px;">
<div class="card p-4 shadow border-0 rounded-3">
<h3 class="text-center
mb-4">Yönetim Paneli</h3>
<form action="" method="POST">
<div class="mb-3">
<label class="form-label">Kullanıcı Adı</label>
<input type="text" name="kullanici"
class="form-control"
required>
</div>
<div class="mb-3">
<label class="form-label">Şifre</label>
<input type="password" name="sifre"
class="form-control"
required>
</div>
<button type="submit" class="btn btn-dark w-100">Giriş
Yap</button>
</form>
</div>
</div>
✍️ Adım 4: Güvenli
Gönderi Oluşturma Alanı (olustur.php)
Sadece
giriş yapmış adminin görebileceği, veritabanına yeni
içerik basan arayüzdür. Burada siber güvenlik açığı oluşmaması için HTML
etiketlerini filtreleme ve XSS koruması uygulayacağız.
<?php
include "baglan.php";
include "header.php";
//
Güvenlik Duvarı: Giriş yapmamış kişiyi kapıdan çevirir
if (!isset($_SESSION['admin_giris'])) {
header("Location: giris.php");
exit;
}
if ($_SERVER["REQUEST_METHOD"] ==
"POST") {
$baslik =
$_POST['baslik'];
// XSS Güvenlik Açığının Kapatılması: htmlspecialchars()
fonksiyonu
// Kullanıcının zararlı script
(kod) girmesini engeller, metne dönüştürür.
$icerik = htmlspecialchars($_POST['icerik']);
if
(!empty($baslik) &&
!empty($icerik)) {
$sorgu = $baglanti->prepare("INSERT
INTO gonderiler (baslik, icerik) VALUES (?, ?)");
$ekle = $sorgu->execute([$baslik, $icerik]);
if
($ekle) {
echo "<div class='container'><div class='alert alert-success'>Yazı
başarıyla yayınlandı!</div></div>";
}
}
}
?>
<div class="container">
<div class="card p-4 shadow-sm border-0">
<h2 class="mb-4">Yeni Blog Yazısı
Yayınla</h2>
<form action="" method="POST">
<div class="mb-3">
<label class="form-label fw-bold">Yazı
Başlığı</label>
<input type="text" name="baslik"
class="form-control
rounded-3" placeholder="Başlık
girin..." required>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Yazı
İçeriği</label>
<textarea name="icerik"
rows="8" class="form-control rounded-3" placeholder="Blog
içeriğini buraya yazın..." required></textarea>
</div>
<button type="submit" class="btn btn-primary
px-4">Yayınla</button>
</form>
</div>
</div>
📖 Adım 5:
Gönderilerin Ana Sayfada Listelenmesi (index.php)
Son
aşamada, veritabanında saklanan tüm postları çekerek
ziyaretçilere Bootstrap kart tasarımlarıyla (Grid
sistemine uygun olarak) gösteriyoruz.
<?php
include "baglan.php";
include "header.php";
//
Veritabanındaki gönderileri çekiyoruz
$sorgu
= $baglanti->query("SELECT * FROM gonderiler
ORDER BY id DESC", PDO::FETCH_ASSOC);
?>
<div class="container">
<div class="row">
<div class="col-12 mb-4">
<h1 class="display-5 fw-bold">Son
Paylaşılan Yazılar</h1>
<p class="text-muted">Teknoloji
ve yazılım dünyasından güncel makaleler.</p>
</div>
</div>
<div class="row">
<?php if($sorgu->rowCount() > 0): ?>
<?php foreach($sorgu
as $yazi): ?>
<!--
Her bir yazı masaüstünde 6'lık yer kaplasın (Yan yana 2 adet kart) -->
<div
class="col-md-6 mb-4">
<div
class="card h-100 shadow-sm border-0 rounded-3">
<div
class="card-body
p-4">
<h3 class="card-title
text-primary fw-bold"><?php echo $yazi['baslik']; ?></h3>
<hr>
<!--
nl2br() veritabanından gelen satır atlamalarını (\n)
HTML break (<br>) etiketine çevirir -->
<p class="card-text
text-secondary"><?php
echo nl2br($yazi['icerik']); ?></p>
</div>
</div>
</div>
<?php endforeach; ?>
<?php else: ?>
<div class="col-12">
<div
class="alert alert-info text-center">Henüz
hiçbir blog yazısı eklenmemiş.</div>
</div>
<?php endif; ?>
</div>
</div>
</body>
</html>
Büyük
final projemizi endüstriyel standartlarda, tam teşekküllü bir İçerik Yönetim
Sistemine (CMS) dönüştürüyoruz. Bu aşamada dosya yükleme güvenliğini,
veri güncellemeyi (UPDATE),
veri silmeyi (DELETE)
ve sitenizi dünyaya açma (Canlıya taşıma) adımlarını eksiksiz kod bloklarıyla
entegre edeceğiz.
🚀 Full Stack Web Tasarım ve Programlama Eğitimi: İleri Seviye
Eklentiler
📸 1. Blog
Yazılarına Resim Yükleme (Dosya Upload) Özelliği
Öncelikle
veritabanımızdaki gonderiler tablosuna resim yollarını
tutmak için yeni bir kolon eklemeliyiz.
📝 olustur.php Dosyasının Güncellenmiş Hali
Form
aracılığıyla dosya gönderebilmek için <form> etiketine mutlaka enctype="multipart/form-data" niteliği eklenmelidir. Güvenlik için sadece jpg, jpeg, png ve webp formatlarına izin vereceğiz.
<?php
include "baglan.php";
include "header.php";
if (!isset($_SESSION['admin_giris'])) {
header("Location: giris.php");
exit;
}
if ($_SERVER["REQUEST_METHOD"] ==
"POST") {
$baslik =
$_POST['baslik'];
$icerik = htmlspecialchars($_POST['icerik']);
// --- RESMİ HAFIZAYA ALMA VE GÜVENLİK
KONTROLLERİ ---
$resimAdi = $_FILES['blog_resim']['name'];
$resimGecici=
$_FILES['blog_resim']['tmp_name'];
$resimHata = $_FILES['blog_resim']['error'];
$dosyaYolu = ""; //
Varsayılan boş yol
if
(!empty($baslik) &&
!empty($icerik) &&
$resimHata === 0) {
// Dosya uzantısını kontrol etme
$uzanti = strtolower(pathinfo($resimAdi,
PATHINFO_EXTENSION));
$izinVerilenUzantilar
= ["jpg", "jpeg", "png",
"webp"];
if
(in_array($uzanti, $izinVerilenUzantilar)) {
// Aynı isimde resim yüklenirse
çakışmasın diye benzersiz isim üretiyoruz
$yeniResimAdi
= uniqid("img_", true) . "."
. $uzanti;
$hedefKlasor = "resimler/" . $yeniResimAdi;
// Geçici klasördeki resmi asıl
klasörümüze taşıyoruz
if (move_uploaded_file($resimGecici, $hedefKlasor)) {
$dosyaYolu
= $hedefKlasor; // Veritabanına
kaydedilecek yol
// SQL Sorgusuna Resmi Dahil
Ediyoruz
$sorgu = $baglanti->prepare("INSERT
INTO gonderiler (baslik, icerik, resim) VALUES (?, ?, ?)");
$ekle = $sorgu->execute([$baslik, $icerik, $dosyaYolu]);
if ($ekle) {
echo "<div class='container'><div class='alert alert-success'>🎉
Yazı ve Resim Başarıyla Yayınlandı!</div></div>";
}
} else {
echo "<div class='container'><div class='alert alert-danger'>Resim
yüklenirken bir hata oluştu.</div></div>";
}
} else {
echo "<div class='container'><div class='alert alert-danger'>Sadece
JPG, JPEG, PNG ve WEBP formatları yüklenebilir!</div></div>";
}
}
}
?>
<div class="container">
<div class="card p-4 shadow-sm border-0">
<h2 class="mb-4">Resimli Yeni Blog Yazısı
Yayınla</h2>
<form action="" method="POST"
enctype="multipart/form-data">
<div class="mb-3">
<label class="form-label fw-bold">Yazı
Başlığı</label>
<input type="text" name="baslik"
class="form-control
rounded-3" required>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Blog
Görseli</label>
<input type="file"
name="blog_resim" class="form-control rounded-3" required>
</div>
<div class="mb-3">
<label class="form-label fw-bold">Yazı
İçeriği</label>
<textarea name="icerik"
rows="6" class="form-control rounded-3" required></textarea>
</div>
<button type="submit" class="btn btn-primary
px-4">Yayınla</button>
</form>
</div>
</div>
🛠️ 2. Admin
İçin Düzenleme (Update) ve Silme (Delete) Ekranları
Yazıları
yönetebilmek için sadece adminin erişebileceği yonetim.php adında bir kontrol paneli
sayfası listesi hazırlayalım.
📄 Adım A:
Yönetim Listesi (yonetim.php)
<?php
include "baglan.php";
include "header.php";
if (!isset($_SESSION['admin_giris'])) {
header("Location: giris.php");
exit;
}
$sorgu
= $baglanti->query("SELECT * FROM gonderiler
ORDER BY id DESC", PDO::FETCH_ASSOC);
?>
<div class="container">
<h2 class="mb-4">İçerik Yönetim Paneli</h2>
<table
class="table table-striped table-hover bg-white p-3 shadow-sm rounded">
<thead class="table-dark">
<tr>
<th>Görsel</th>
<th>Başlık</th>
<th>İşlemler</th>
</tr>
</thead>
<tbody>
<?php foreach($sorgu
as $satir): ?>
<tr>
<td>
<?php
if(!empty($satir['resim'])):
?>
<img src="<?php echo $satir['resim'];
?>" width="60" class="rounded">
<?php
else: ?>
<span
class="text-muted">Görsel
Yok</span>
<?php
endif; ?>
</td>
<td class="align-middle fw-bold"><?php echo $satir['baslik']; ?></td>
<td class="align-middle">
<a
href="duzenle.php?id=<?php echo $satir['id'];
?>" class="btn
btn-sm btn-warning">Düzenle</a>
<a
href="sil.php?id=<?php echo $satir['id'];
?>" class="btn
btn-sm btn-danger" onclick="return confirm('Bu yazıyı silmek istediğinize emin
misiniz?')">Sil</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
📝 Adım B:
Yazı Düzenleme Sayfası (duzenle.php)
URL'den
gelen id
parametresine göre eski verileri formun içine doldurur ve UPDATE sorgusuyla günceller.
<?php
include "baglan.php";
include "header.php";
if (!isset($_SESSION['admin_giris']) || !isset($_GET['id']))
{
header("Location: giris.php");
exit;
}
$id
= $_GET['id'];
//
Eski veriyi çekip forma basıyoruz
$sorgu
= $baglanti->prepare("SELECT * FROM gonderiler
WHERE id = ?");
$sorgu->execute([$id]);
$yazi = $sorgu->fetch(PDO::FETCH_ASSOC);
if ($_SERVER["REQUEST_METHOD"] ==
"POST") {
$yeniBaslik = $_POST['baslik'];
$yeniIcerik = htmlspecialchars($_POST['icerik']);
// Eğer yeni bir resim yüklenmişse mevcut
resmi değiştir, yüklenmemişse eski resmi koru
if
($_FILES['blog_resim']['error']
=== 0) {
$uzanti = strtolower(pathinfo($_FILES['blog_resim']['name'],
PATHINFO_EXTENSION));
$yeniResimAdi
= uniqid("img_", true) . "."
. $uzanti;
move_uploaded_file($_FILES['blog_resim']['tmp_name'],
"resimler/" . $yeniResimAdi);
$dosyaYolu =
"resimler/" . $yeniResimAdi;
// Eski fiziksel resmi klasörden silme
(Sunucuda çöp birikmesin diye)
if(file_exists($yazi['resim'])) { unlink($yazi['resim']); }
} else {
$dosyaYolu =
$yazi['resim']; // Eski resim yolu kalıyor
}
// UPDATE Sorgusu
$guncelle = $baglanti->prepare("UPDATE gonderiler SET baslik = ?, icerik = ?, resim = ?
WHERE id = ?");
$durum
= $guncelle->execute([$yeniBaslik, $yeniIcerik, $dosyaYolu, $id]);
if
($durum) {
header("Location: yonetim.php");
exit;
}
}
?>
<div class="container">
<div class="card p-4 shadow-sm border-0">
<h2>Yazıyı
Düzenle</h2>
<form action="" method="POST"
enctype="multipart/form-data">
<div class="mb-3">
<label class="form-label">Başlık</label>
<input type="text" name="baslik"
class="form-control"
value="<?php echo $yazi['baslik'];
?>" required>
</div>
<div class="mb-3">
<label class="form-label">Mevcut Görsel</label><br>
<img src="<?php echo $yazi['resim'];
?>" width="120" class="mb-2
rounded shadow-sm">
<input type="file"
name="blog_resim" class="form-control">
</div>
<div class="mb-3">
<label class="form-label">İçerik</label>
<textarea name="icerik"
rows="6" class="form-control" required><?php echo $yazi['icerik']; ?></textarea>
</div>
<button type="submit" class="btn btn-success">Değişiklikleri
Kaydet</button>
</form>
</div>
</div>
🗑️ Adım C:
Yazı Silme İşlemi (sil.php)
Sadece
veritabanından satırı silmek yetmez; sunucu disk
alanını korumak için yüklenen resim dosyasını da diskten tamamen (unlink) kazımalıyız.
<?php
include "baglan.php";
session_start();
if (isset($_SESSION['admin_giris']) && isset($_GET['id']))
{
$id = $_GET['id'];
// Önce silinecek yazının resim yolunu
öğreniyoruz
$sorgu = $baglanti->prepare("SELECT
resim FROM gonderiler WHERE id = ?");
$sorgu->execute([$id]);
$yazi =
$sorgu->fetch(PDO::FETCH_ASSOC);
// Fiziksel resmi sunucu klasöründen
siliyoruz
if
(!empty($yazi['resim'])
&& file_exists($yazi['resim']))
{
unlink($yazi['resim']);
}
// Veritabanı
satırını siliyoruz
$sil = $baglanti->prepare("DELETE
FROM gonderiler WHERE id = ?");
$sil->execute([$id]);
}
header("Location:
yonetim.php");
exit;
?>
🌎 3. Projenin
Localhost'tan Gerçek Web Sitesine (Hosting/Domain) Taşınması
Projenizi
bilgisayarınızdan çıkarıp dünyaya açmak için bir Domain (Alan Adı:
orneksite.com) ve bir Linux/cPanel tabanlı PHP
Hosting (Sunucu Alanı) edinmelisiniz. Taşıma
işlemi tam olarak 4 adımdan oluşur:
📦 Adım 1:
Dosyaların Arşivlenmesi ve FTP ile Yüklenmesi
💾 Adım 2: Local Veritabanının Dışa
Aktarılması
🗄️ Adım 3:
Canlı Sunucuda Veritabanı ve Kullanıcı Oluşturma
⚙️ Adım 4:
Canlı Sunucu Bağlantı Ayarı (baglan.php)
Canlı
sunucuda veritabanı kullanıcı adı ve şifreleri root ve "" (boş) olamaz. Sunucudaki baglan.php dosyasını cPanel üzerinden düzenle diyerek açın ve yeni cPanel bilgilerinizle güncelleyin:
<?php
try {
// Canlı sunucuda host genellikle yine 'localhost' kalır
$baglanti = new PDO("mysql:host=localhost;dbname=cpanel_olusturulan_db_adi;charset=utf8",
"cpanel_olusturulan_user", "cpanel_sifresi");
$baglanti->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e) {
die("Bağlantı başarısız: " . $e->getMessage());
}
?>
Artık
web siteniz alan adınızı (Örn: ://orneksite.com) tarayıcıya yazan herkes
için tüm dünyada yayındadır!