Kullanıcıyla Konuşmaya Başlıyoruz: Formların Dünyasına Giriş
Merhaba, ben Buğrahan. Eğer bu yazı dizisini başından beri takip ediyorsanız, PHP'nin temellerini, değişkenleri, dizileri ve o meşhur döngüleri birlikte aştık demektir. Serimizin 6. yazısına hoş geldiniz. Bugüne kadar yazdığımız kodlar hep kendi içine kapalıydı; yani biz bir değişken tanımlıyorduk, PHP onu işleyip ekrana basıyordu. Ancak web dünyası tek taraflı bir monolog değildir. Web, etkileşimdir.
Yazılımla ilk tanıştığım 2005 yılına dönüp baktığımda, HTML ile yaptığım ilk sitelerin sadece dijital birer broşür olduğunu hatırlıyorum. Ekranda yazılar vardı, resimler vardı ama site bana cevap vermiyordu. Ta ki ilk iletişim formumu yapıp, kendi yazdığım bir kutucuğa ismimi girip "Gönder" butonuna basana kadar... O an ekranda "Merhaba Buğrahan, mesajın alındı!" yazısını gördüğümde hissettiğim büyülenmeyi tarif edemem. İşte o gün, web sitelerinin sadece okunacak değil, yaşanacak ve etkileşime girilecek platformlar olduğunu anlamıştım.
Bugün Pixel Lab®'da karmaşık sistemler, devasa portallar kurarken bile işin özünde hep aynı mantık yatıyor: Kullanıcıdan veriyi al, işle ve bir sonuç üret. PHP form işleme sanatı, sitenize bir kulak ve bir ağız vermektir. Hadi gelin, bilgisayar ekranının arkasından çıkıp kullanıcılarımızla nasıl veri alışverişi yapacağımızı, işin mutfağına inerek konuşalım.
HTML Tarafı: Verinin Doğduğu Yer
PHP'nin sihrini konuşturabilmesi için önce bir sahneye ihtiyacımız var. Bu sahneyi HTML ile kuruyoruz. Bir form oluştururken kullandığımız temel etiketleri kısaca bir hatırlayalım. Çünkü burada yapacağımız ufak bir hata, PHP tarafında saç baş yoldurabilir.
<form action="islem.php" method="POST">
<label for="isim">Adınız:</label>
<input type="text" id="isim" name="kullanici_adi">
<button type="submit">Gönder</button>
</form>
Bu basit yapıda dikkat etmeniz gereken çok kritik bir nokta var: name özniteliği. HTML tarafında görsel olarak her şey harika görünebilir, CSS ile o input kutusuna harika gölgeler vermiş olabilirsiniz. Ama PHP'nin gözü kördür; o sadece name etiketine bakar. Yukarıdaki örnekte, kullanıcı oraya "Ahmet" yazdığında, PHP bu veriyi "kullanici_adi" etiketiyle tanıyacak. Eğer name etiketini yazmayı unutursanız, PHP'ye boş bir zarf göndermiş olursunuz.
Büyük Kapışma: GET ve POST Farkı
Kullanıcı formdaki butona bastığında, verinin sunucuya (yani PHP'ye) taşınması gerekir. Bu taşıma işlemi için iki farklı kargo şirketimiz var: GET ve POST. İkisi de aynı işi yapar ama tarzları tamamen farklıdır. Yazılıma yeni başlayanların en çok kafasını karıştıran, GET ve POST farkı konusudur. Gelin bunu ormandaki kamp hayatımdan bir örnekle anlatayım.
GET Metodu: Şeffaf Sırt Çantası
GET metodunu kullandığınızda, formdaki tüm veriler URL'nin (adres çubuğunun) sonuna eklenerek gönderilir. Tıpkı şeffaf bir sırt çantası takmak gibidir; içine ne koyarsanız herkes görür.
Örneğin bir arama formunda GET kullanırsanız, URL şuna benzer: site.com/arama.php?kelime=kamp+cadiri
Neden GET kullanırız? Çünkü URL'de taşınan veriler paylaşılabilirdir. Ben YouTube kanalım için doğa belgeselleri araştırırken, bulduğum harika bir arama sonucunun linkini kopyalayıp arkadaşıma gönderebilirim. O da aynı linke tıkladığında aynı sonuçları görür. Ancak GET metodunun bir sınırı vardır; çok büyük metinleri (örneğin koca bir blog yazısını) URL'ye sığdıramazsınız. Ve en önemlisi, asla ama asla şifre gibi hassas verileri GET ile göndermemelisiniz. Aksi halde kullanıcının şifresi kabak gibi adres çubuğunda yazar!
POST Metodu: Çelik Kasa
POST metodu ise verileri arka planda, HTTP istek gövdesinin içinde gizlice gönderir. Adres çubuğunda hiçbir şey değişmez. Bu, verileri kilitli bir çelik kasa içinde zırhlı araçla taşımaya benzer.
Eğer bir kullanıcı kayıt formu, iletişim formu veya dosya yükleme işlemi yapıyorsanız, kesinlikle POST kullanmalısınız. Hem veri boyutu sınırı yoktur (sunucu ayarlarınıza bağlı olarak gigabaytlarca veri gönderebilirsiniz) hem de bilgiler ortalıkta görünmez.
Süper Globaller Sahnede: $_GET ve $_POST
Kullanıcı veriyi gönderdi, peki biz bu veriyi PHP'de nasıl havada yakalayacağız? İşte burada PHP'nin "Süper Globalleri" devreye giriyor. Bunlar, PHP'nin her yerinden ulaşılabilen özel dizilerdir (arrays).
Eğer formunuz method="POST" ile gönderildiyse, veriler $_POST dizisinin içine düşer. method="GET" kullanıldıysa $_GET dizisine düşer. Mantık bu kadar basit.
PHP $_POST kullanımı üzerine odaklanalım. Diyelim ki formumuz POST ile geldi. Veriyi şöyle alıyoruz:
<?php
// Formdaki name="kullanici_adi" olan veriyi değişkene atıyoruz
$gelen_isim = $_POST['kullanici_adi'];
echo "Hoş geldin, " . $gelen_isim;
?>
İşte sihir gerçekleşti! Kullanıcının yazdığı o metin, artık bizim PHP kodlarımızın içinde bir değişken. İstediğimiz gibi evirip çevirebilir, veritabanına kaydedebilir veya ekrana basabiliriz.
En Kritik Kural: Kullanıcıya Asla Güvenme!
Buraya kadar her şey çok güzel, çok masum. Ama size yılların verdiği tecrübeyle, uykusuz geçirdiğim gecelerin faturası olarak edindiğim altın kuralı söyleyeyim: Kullanıcıya asla güvenmeyin.
Bunu kötü niyetli oldukları için söylemiyorum. İnsanlar hata yapar. İsim yerine yanlışlıkla boşluk tuşuna basıp formu gönderebilirler, e-posta yerine telefon numarası yazabilirler veya gerçekten kötü niyetli biri sisteminizi çökertmek için formunuza zararlı kodlar girebilir. Bu yüzden PHP form doğrulama (validation) ve veri temizleme (sanitization) adımları, bir yazılımcının savunma hattıdır.
1. Boşluk Kontrolü: Gerçekten Bir Şey Gönderdi mi?
Kullanıcı butona bastı ama içi boş mu bastı? Bunu empty() ve isset() fonksiyonlarıyla kontrol ederiz. isset() o değişkenin var olup olmadığına bakar, empty() ise içinin boş olup olmadığına.
<?php
if (empty($_POST['kullanici_adi'])) {
echo "Lütfen isminizi girin, böyle isimsiz kahraman gibi olmuyor.";
} else {
// İşlemlere devam et
}
?>
2. XSS Saldırılarına Karşı Kalkan: htmlspecialchars()
Diyelim ki kullanıcı isim kutusuna adını değil de şu kodu yazdı: <script>alert('Siteni Hackledim!');</script>. Eğer siz bu veriyi temizlemeden doğrudan ekrana basarsanız, o JavaScript kodu çalışır. Buna XSS (Cross-Site Scripting) saldırısı denir. Geçmişte bu hatayı yapıp kendi sitemde kendi kendime uyarı pencereleri çıkartmışlığım vardır.
Bunu engellemenin en temiz yolu htmlspecialchars() fonksiyonudur. Bu fonksiyon, HTML etiketlerini zararsız metinlere dönüştürür.
<?php
// Kötü niyetli kodlar artık sadece düz bir yazıya dönüştü.
$temiz_isim = htmlspecialchars($_POST['kullanici_adi']);
?>
3. Doğru Format: Bu Gerçekten Bir E-posta mı?
Kullanıcı e-posta alanına "ahmetin_maili" yazıp bırakabilir. PHP'de bunun formatını kontrol etmek için harika bir yerleşik filtre vardır: filter_var().
<?php
$email = $_POST['eposta'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Dostum, bu geçerli bir e-posta adresi değil. Lütfen kontrol et.";
}
?>
İşin Mutfağı: Tam Teşekküllü Bir İletişim Formu
Konuşmayı bırakıp biraz kod yazalım. Şimdi, öğrendiğimiz her şeyi tek bir dosyada birleştireceğiz. Hem HTML formumuz hem de PHP kodlarımız aynı dosyada (örneğin iletisim.php) olacak. Bu, en yaygın ve en pratik kullanımlardan biridir.
Aşağıdaki kodu dikkatlice inceleyin. Adım adım neler yaptığımızı yorum satırlarında anlattım.
<?php
// Değişkenlerimizi başlangıçta boş olarak tanımlıyoruz
$isim = $email = $mesaj = "";
$hata = "";
$basari_mesaji = "";
// Form gönderildi mi diye kontrol ediyoruz (Metot POST ise)
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 1. İSİM KONTROLÜ
if (empty($_POST["isim"])) {
$hata = "İsim alanı zorunludur.";
} else {
// Gelen veriyi temizliyoruz
$isim = htmlspecialchars(trim($_POST["isim"]));
}
// 2. E-POSTA KONTROLÜ
if (empty($_POST["email"])) {
$hata = "E-posta alanı zorunludur.";
} else {
$email = htmlspecialchars(trim($_POST["email"]));
// Format doğru mu?
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$hata = "Geçersiz e-posta formatı.";
}
}
// 3. MESAJ KONTROLÜ
if (empty($_POST["mesaj"])) {
$hata = "Lütfen bir mesaj yazın.";
} else {
$mesaj = htmlspecialchars(trim($_POST["mesaj"]));
}
// HATA YOKSA İŞLEMİ TAMAMLA
if (empty($hata)) {
// Burada normalde veritabanına kaydetme veya mail atma işlemi yapılır.
// Biz şimdilik ekrana başarı mesajı basıyoruz.
$basari_mesaji = "Harika! Mesajını aldık " . $isim . ". En kısa sürede sana döneceğiz.";
// Formu tekrar doldurmaması için değişkenleri sıfırlayabiliriz
$isim = $email = $mesaj = "";
}
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Bize Ulaşın</title>
</head>
<body>
<h2>Doğa Yürüyüşü İçin İletişimde Kalın</h2>
<!-- Hata veya Başarı mesajlarını burada gösteriyoruz -->
<?php if(!empty($hata)): ?>
<p style="color: red;"><strong>Hata:</strong> <?php echo $hata; ?></p>
<?php endif; ?>
<?php if(!empty($basari_mesaji)): ?>
<p style="color: green;"><strong><?php echo $basari_mesaji; ?></strong></p>
<?php endif; ?>
<!-- action alanını boş bırakmak, formu bulunduğu sayfaya gönderir -->
<form action="" method="POST">
<div>
<label for="isim">Adınız:</label><br>
<!-- value kısmına PHP kodu ekleyerek, hata durumunda kullanıcının yazdıklarının silinmemesini sağlıyoruz -->
<input type="text" name="isim" id="isim" value="<?php echo $isim; ?>">
</div>
<br>
<div>
<label for="email">E-Posta Adresiniz:</label><br>
<input type="text" name="email" id="email" value="<?php echo $email; ?>">
</div>
<br>
<div>
<label for="mesaj">Mesajınız:</label><br>
<textarea name="mesaj" id="mesaj" rows="5"><?php echo $mesaj; ?></textarea>
</div>
<br>
<button type="submit">Mesajı Gönder</button>
</form>
</body>
</html>
İşte bu kadar! Bu kod bloğu aslında Pixel Lab®'da müşterilerimiz için kurduğumuz devasa sistemlerin en temel hücre yapısıdır. Veriyi al, kontrol et, temizle ve işle. Dikkat ederseniz HTML formunun içindeki value niteliklerine küçük PHP kodları ekledim. Bu sayede kullanıcı mesela e-postayı yanlış yazdığında sayfa yenilendiğinde girdiği isim ve mesaj silinmiyor, orada kalıyor. Kullanıcı deneyimi (UX) dediğimiz o havalı kavram aslında tam olarak bu küçük inceliklerde gizli.
Artık İpleri Elinize Aldınız
Bugün web geliştirme serüveninizde çok büyük bir eşiği atladınız. Artık sadece ekrana bir şeyler yazdıran değil, ekranın karşısındaki insanı dinleyen, onunla etkileşime giren dinamik sayfalar yapabiliyorsunuz. GET'in o paylaşımcı ama şeffaf yapısını, POST'un ise ağırbaşlı ve güvenli yapısını öğrendiniz. En önemlisi, formlardan gelen veriyi doğrulamanın neden hayati bir güvenlik adımı olduğunu kavradınız.
Kod yazmak gerçekten sıfırdan bir bina inşa etmek gibi. Formlar ise bu binanın kapıları ve pencereleri. O kapılardan kimin gireceğini kontrol etmek sizin elinizde.
Şimdi bilgisayarı kapatıp bisikletime atlama ve ormanda biraz kafamı dinleme vakti geldi. Siz de bu anlattıklarımı kendi bilgisayarınızda mutlaka deneyin, hata yapmaktan korkmayın. Hatalar en iyi öğretmenlerdir. Hatta ilk formunuzu yaparken karşılaştığınız o komik veya sinir bozucu hatalar varsa, yorumlarda benimle paylaşın, üzerine konuşalım. Bir sonraki yazımızda, kullanıcılardan aldığımız bu verileri kalıcı olarak nasıl saklayacağımızı, yani veritabanı dünyasına giriş kapısını aralayacağız. O zamana kadar kodunuz temiz, zihniniz açık olsun.
Yorumlar
Henüz yorum yapılmamış. İlk yorumu siz yazın!
Yorum Yaz