Web sitenizin ‘Bize Ulaşın’ sayfası sadece bir formalite mi, yoksa potansiyel müşterilerle, okuyucularla aranızdaki en güçlü köprü mü? Peki ya bu köprüyü kurarken yaptığınız küçük bir güvenlik hatası, size ulaşmaya çalışan herkesi aslında siber saldırganların tuzağına gönderiyorsa? Çoğu zaman basit bir ‘kopyala-yapıştır’ koduyla geçiştirilen iletişim formları, aslında bir web sitesinin en kritik bileşenlerinden biridir. Gelin, PHP’nin ham gücünü kullanarak sadece çalışan değil, aynı zamanda zırh gibi sağlam, kullanıcı dostu ve profesyonel bir iletişim köprüsü nasıl inşa edilir, en ince detaylarına kadar birlikte keşfedelim.
Her Şeyin Başlangıcı: Sağlam Bir HTML İskeleti
PHP kodlarımızı yazmaya başlamadan önce, verileri toplayacağımız sahneyi hazırlamamız gerekiyor: HTML formu. Bu iskelet ne kadar temiz ve standartlara uygun olursa, PHP ile yönetmesi o kadar kolay olur. Unutmayın, her bir `name` özelliği, PHP’nin veriyi yakalayacağı kancadır.
İşte ihtiyacımız olan temel HTML yapısı:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>İletişim Formu</title>
</head>
<body>
<form action="iletisim.php" method="POST">
<label for="adsoyad">Adınız Soyadınız:</label><br>
<input type="text" id="adsoyad" name="adsoyad" required><br><br>
<label for="email">E-posta Adresiniz:</label><br>
<input type="email" id="email" name="email" required><br><br>
<label for="konu">Konu:</label><br>
<input type="text" id="konu" name="konu" required><br><br>
<label for="mesaj">Mesajınız:</label><br>
<textarea id="mesaj" name="mesaj" rows="6" required></textarea><br><br>
<button type="submit" name="gonder">Formu Gönder</button>
</form>
</body>
</html>
- `action=”iletisim.php”`: Form gönderildiğinde verilerin hangi dosyaya işlenmek üzere yollanacağını belirtir. Kendine veri gönderen formlar için bu alan boş bırakılabilir veya dosyanın kendi adı yazılabilir.
- `method=”POST”`: Verilerin tarayıcının adres çubuğunda görünmeden, arka planda güvenli bir şekilde gönderilmesini sağlar. Hassas veriler için GET metodu asla kullanılmamalıdır.
- `name=”…”`: Bu, PHP’nin `$_POST` süper global dizisi aracılığıyla belirli bir alanın değerini almasını sağlayan anahtardır. `name` özelliği olmayan bir form elemanı PHP için görünmezdir.
PHP’nin Sahneye Çıkışı: Verileri Yakalamak ve İşlemek
HTML iskeletimiz hazır. Şimdi sıra, gönderilen bu verileri havada yakalayıp anlamlı bir eyleme dönüştürecek olan PHP kodlarını yazmaya geldi. Tüm PHP mantığımızı, HTML’den önce, dosyanın en üstüne yerleştireceğiz.
İlk adım, formun gönderilip gönderilmediğini kontrol etmektir. Bunu, gönder butonumuza verdiğimiz `name` özelliği sayesinde yaparız.
<?php
if (isset($_POST['gonder'])) {
// Form gönderilmiş, şimdi verileri alabiliriz.
$adsoyad = $_POST['adsoyad'];
$email = $_POST['email'];
$konu = $_POST['konu'];
$mesaj = $_POST['mesaj'];
// Buraya doğrulama ve e-posta gönderme kodları gelecek.
}
?>
Yukarıdaki kod bloğu, `gonder` isimli bir POST verisi varsa çalışır. Bu, kullanıcının butona bastığı anlamına gelir. Ancak bu haliyle kodumuz son derece savunmasızdır. Gelen veriyi olduğu gibi almak, kapınızı ardına kadar kötü niyetli kişilere açmak demektir.
Güvenlik Kalkanları: Formunuzu Saldırılara Karşı Zırhlayın
İnternete açık bir form, potansiyel bir güvenlik açığıdır. Neyse ki PHP, bu açıkları kapatmak için bize güçlü araçlar sunar. Bu adımları atlamak, ileride başınızı çok ağrıtabilir.
H3: XSS (Cross-Site Scripting) Saldırılarına Elveda Deyin
XSS, saldırganın formunuz aracılığıyla sitenize zararlı JavaScript kodları enjekte etmesidir. Eğer gelen veriyi temizlemeden e-postanıza alır veya veritabanına kaydedip başka bir sayfada gösterirseniz, bu kodlar çalışarak çerezlerinizi çalabilir veya kullanıcılarınızı başka sitelere yönlendirebilir.
Çözüm: `htmlspecialchars()` fonksiyonu. Bu fonksiyon, “, `&` gibi özel HTML karakterlerini zararsız metinlere dönüştürür. Böylece tarayıcı bunları kod olarak yorumlayamaz.
// GÜVENSİZ YÖNTEM
$adsoyad = $_POST['adsoyad'];
// GÜVENLİ YÖNTEM
$adsoyad = htmlspecialchars($_POST['adsoyad']);
$email = htmlspecialchars($_POST['email']);
$konu = htmlspecialchars($_POST['konu']);
$mesaj = htmlspecialchars($_POST['mesaj']);
H3: Veri Doğrulama (Validation): Kuralları Siz Koyun
Her alanın beklediğiniz formatta olup olmadığını kontrol etmek zorundasınız. Kullanıcı e-posta alanına geçerli bir e-posta adresi mi girdi? Ad soyad alanını boş mu bıraktı? Bu kontrolleri yapmazsanız, anlamsız veya eksik verilerle dolu e-postalar alırsınız.
- Boş Alan Kontrolü: `empty()` fonksiyonu bir değişkenin boş olup olmadığını kontrol eder.
- E-posta Formatı Kontrolü: `filter_var($email, FILTER_VALIDATE_EMAIL)` fonksiyonu, bir metnin geçerli bir e-posta formatında olup olmadığını kontrol etmenin en modern ve güvenilir yoludur.
- Gereksiz Boşlukları Temizleme: `trim()` fonksiyonu, bir metnin başındaki ve sonundaki boşlukları temizler. Bu, kullanıcıların yanlışlıkla bıraktığı boşluklar yüzünden doğrulama hataları almasını engeller.
Gelin bu kontrolleri bir hata dizisi mantığıyla koda dökelim:
$errors = []; // Hataları saklayacağımız dizi
// Ad Soyad Kontrolü
if (empty(trim($_POST['adsoyad']))) {
$errors[] = "Ad soyad alanı boş bırakılamaz.";
}
// E-posta Kontrolü
if (empty(trim($_POST['email']))) {
$errors[] = "E-posta alanı boş bırakılamaz.";
} elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
$errors[] = "Lütfen geçerli bir e-posta adresi girin.";
}
// Mesaj Kontrolü
if (empty(trim($_POST['mesaj']))) {
$errors[] = "Mesaj alanı boş bırakılamaz.";
}
E-Posta Gönderim Sanatı: `mail()` Fonksiyonu
Tüm verileri temizledik ve doğruladık. Artık `count($errors) === 0` ise, yani hiç hata yoksa, e-postayı gönderebiliriz. PHP’nin yerleşik `mail()` fonksiyonu bu iş için en temel araçtır.
if (count($errors) === 0) {
// E-postanın gönderileceği adres
$kime = "bilgi@siteniz.com";
// E-postanın başlığı (Konu alanından gelen veri)
$eposta_konu = "İletişim Formu Mesajı: " . htmlspecialchars(trim($_POST['konu']));
// E-postanın içeriği
$eposta_icerik = "Ad Soyad: " . htmlspecialchars(trim($_POST['adsoyad'])) . "n";
$eposta_icerik .= "E-posta: " . htmlspecialchars(trim($_POST['email'])) . "n";
$eposta_icerik .= "Mesaj: n" . htmlspecialchars(trim($_POST['mesaj']));
// E-posta başlıkları (Headers) - BU ÇOK ÖNEMLİ!
$headers = "From: " . htmlspecialchars(trim($_POST['email'])) . "rn";
$headers .= "Reply-To: " . htmlspecialchars(trim($_POST['email'])) . "rn";
$headers .= "Content-Type: text/plain; charset=UTF-8rn";
// E-postayı gönder
if (mail($kime, $eposta_konu, $eposta_icerik, $headers)) {
$success_message = "Mesajınız başarıyla gönderildi. Teşekkür ederiz!";
} else {
$errors[] = "Mesaj gönderilirken bir hata oluştu. Lütfen daha sonra tekrar deneyin.";
}
}
DİKKAT: `mail()` fonksiyonunun çalışması için sunucunuzda bir mail sunucusunun (örn: Sendmail) kurulu ve yapılandırılmış olması gerekir. Paylaşımlı hostinglerde bu genellikle aktiftir, ancak yerel sunucularda (localhost) çalışmayabilir. Daha profesyonel ve güvenilir gönderimler için PHPMailer gibi SMTP kütüphaneleri kullanılması şiddetle tavsiye edilir.
Kullanıcıya Geri Bildirim: Her Şeyi Birleştirelim
Son adım, kullanıcıya ne olduğunu bildirmektir. Hata mı var, yoksa mesaj başarıyla gitti mi? Bu mesajları formun üzerinde göstermek, en iyi kullanıcı deneyimini sunar.
İşte tüm parçaları birleştiren, tek bir `iletisim.php` dosyası:
<?php
$errors = [];
$success_message = '';
// Form gönderildi mi kontrolü
if (isset($_POST['gonder'])) {
// Verileri al ve temizle
$adsoyad = trim($_POST['adsoyad']);
$email = trim($_POST['email']);
$konu = trim($_POST['konu']);
$mesaj = trim($_POST['mesaj']);
// Doğrulama kontrolleri
if (empty($adsoyad)) {
$errors[] = 'Ad soyad alanı boş bırakılamaz.';
}
if (empty($email)) {
$errors[] = 'E-posta alanı boş bırakılamaz.';
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'Lütfen geçerli bir e-posta adresi girin.';
}
if (empty($konu)) {
$errors[] = 'Konu alanı boş bırakılamaz.';
}
if (empty($mesaj)) {
$errors[] = 'Mesaj alanı boş bırakılamaz.';
}
// Hata yoksa e-postayı gönder
if (empty($errors)) {
$kime = 'bilgi@siteniz.com'; // Kendi e-posta adresinizi yazın
$eposta_konu = "İletişim Formu: $konu";
$eposta_icerik = "Gönderen: $adsoyadn";
$eposta_icerik .= "E-posta: $emailnn";
$eposta_icerik .= "Mesaj:n$mesaj";
$headers = "From: $email";
if (mail($kime, $eposta_konu, $eposta_icerik, $headers)) {
$success_message = 'Mesajınız başarıyla gönderildi!';
// Formu temizlemek için değişkenleri sıfırla
$_POST = [];
} else {
$errors[] = 'E-posta gönderilirken bir sorun oluştu.';
}
}
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>PHP İletişim Formu</title>
<style>
.error { color: red; }
.success { color: green; }
</style>
</head>
<body>
<h2>Bize Ulaşın</h2>
<?php if (!empty($errors)): ?>
<div class="error">
<strong>Lütfen aşağıdaki hataları düzeltin:</strong>
<ul>
<?php foreach ($errors as $error): ?>
<li><?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<?php if ($success_message): ?>
<div class="success"><?php echo $success_message; ?></div>
<?php endif; ?>
<form action="" method="POST">
Ad Soyad:<br>
<input type="text" name="adsoyad" value="<?php echo isset($_POST['adsoyad']) ? htmlspecialchars($_POST['adsoyad']) : ''; ?>"><br><br>
E-posta:<br>
<input type="text" name="email" value="<?php echo isset($_POST['email']) ? htmlspecialchars($_POST['email']) : ''; ?>"><br><br>
Konu:<br>
<input type="text" name="konu" value="<?php echo isset($_POST['konu']) ? htmlspecialchars($_POST['konu']) : ''; ?>"><br><br>
Mesaj:<br>
<textarea name="mesaj" rows="5"><?php echo isset($_POST['mesaj']) ? htmlspecialchars($_POST['mesaj']) : ''; ?></textarea><br><br>
<button type="submit" name="gonder">Gönder</button>
</form>
</body>
</html>
Bu son kod bloğunda, hata durumunda kullanıcının girdiği verilerin kaybolmaması için `value` özelliklerine PHP kodları eklediğimize dikkat edin. Buna “Sticky Form” (Yapışkan Form) denir ve kullanıcı deneyimini önemli ölçüde artırır.
Artık elinizde sadece çalışan bir form değil, aynı zamanda güvenli, kullanıcı dostu ve profesyonel bir iletişim aracı var. Bu kodlar, web sitenizin sessiz bir broşür olmaktan çıkıp, ziyaretçilerinizle 7/24 diyalog kuran canlı bir platforma dönüşmesinin ilk adımıdır. Unutmayın, en değerli geri bildirimler ve fırsatlar, size en kolay ve güvenli şekilde ulaşabilen kullanıcılardan gelir.
