Anasayfa / PHP / PHP Form İşlemleri

PHP Form İşlemleri

Web siteleri sadece metin okuduğumuz statik sayfalar olmaktan çıkıp, kullanıcılarla etkileşime giren dinamik platformlara dönüştüğünde, bu etkileşimin kalbinde “Formlar” yer almaya başladı. Bir e-ticaret sitesine üye olurken, bir arama motorunda kelime aratırken veya iletişim sayfasından mesaj gönderirken hep formları kullanırız.

Bu rehberimizde, PHP öğrenme serüveninizde çok kritik bir eşik olan PHP Form İşlemleri konusunu inceleyeceğiz. Kullanıcıdan nasıl veri alınacağını, GET ve POST metotlarının farklarını, formlarda çoklu veri (dizi) yönetimini ve en önemlisi form güvenliğini adım adım, örneklerle öğreneceksiniz.

HTML Formlarının Temeli: Action ve Method

PHP’nin form verilerini işleyebilmesi için, öncelikle kullanıcıya gösterilecek bir HTML formuna ihtiyacımız vardır. Standart bir HTML formu oluşturulurken en çok dikkat edilmesi gereken iki temel nitelik (attribute) vardır:

  1. Action (action): Formun içindeki “Gönder” veya “Kaydet” butonuna tıklandığında, kullanıcının girdiği verilerin işlenmek üzere hangi PHP sayfasına gönderileceğini belirtir (Örneğin: action="islem.php").
  2. Method (method): Verilerin o sayfaya hangi yöntemle taşınacağını belirler. Web dünyasında bu işlem için ağırlıklı olarak GET ve POST metotları kullanılır.

GET ve POST Metotları Arasındaki Farklar Nelerdir?

PHP’de form verilerini alırken karşılaştığımız en önemli karar, verinin hangi metotla gönderileceğidir.

  • GET Metodu: Verileri sayfanın URL’si (adres çubuğu) üzerinden, açık bir şekilde taşır. Örneğin bir arama yaptığınızda adres çubuğunda ?arama=php+dersleri gibi bir ifade görürsünüz. GET metodu sayfaları favorilere eklemek (bookmarking) veya arama sonuçlarını paylaşmak için harikadır. Ancak adres çubuğunda göründüğü için şifre veya kredi kartı gibi hassas verilerin gönderiminde asla kullanılmamalıdır. Ayrıca URL uzunluğunun bir sınırı olduğu için devasa metinleri GET ile gönderemezsiniz. GET metodu ile gelen veriler PHP’de $_GET süper global dizisi ile yakalanır.
  • POST Metodu: Verileri HTTP istek gövdesinin (body) içine gizleyerek, arka planda gönderir. Adres çubuğunda hiçbir veri görünmez. Bu sayede hem çok daha güvenlidir (kullanıcı şifreleri gizli kalır) hem de blog yazıları, resim dosyaları veya uzun formlar gibi boyut sınırı olmayan devasa verileri taşımak için uygundur. POST ile gelen veriler PHP’de $_POST süper global dizisi ile yakalanır.

İlk Form Uygulamamız (POST ile Veri Yakalama)

Kullanıcıdan araba markasını ve istediği rengi girmesini isteyen basit bir Web formu yapalım.

Adım 1: HTML Formunun Oluşturulması (choose.html)

<!DOCTYPE html>
<html>
<body>
  <h2>Arabanızı Seçin</h2>
  <!-- Form verileri car.php sayfasına POST metodu ile gönderilecek -->
  <form method="post" action="car.php">
    Tür: <br />
    <select name="selType">
      <option value="Porsche 911">Porsche 911</option>
      <option value="Volkswagen Beetle">Volkswagen Beetle</option>
      <option value="Ford Taurus">Ford Taurus</option>
    </select><p />
    Renk: <br />
    <!-- Renk bilgisi txtColor isimli değişkene atanacak -->
    <input type="text" name="txtColor" /> <p />
    <input type="submit" value="Gönder" />
  </form>
</body>
</html>

Adım 2: PHP Tarafında Verilerin Yakalanması (car.php) Kullanıcı formu doldurup Gönder tuşuna bastığında, veriler car.php sayfasına ulaşır. Bu verileri almak için HTML’deki name="" etiketlerine verdiğimiz isimleri kullanırız:

<?php
// formdan gelen verileri $_POST dizisi ile alıp değişkenlere atıyoruz
$type = $_POST['selType'];
$color = $_POST['txtColor'];

// Ekrana yazdırıyoruz
echo "Sarı renkli $color $type aracınız hazır. İyi sürüşler!";
?>

Eğer kullanıcı araba olarak “Volkswagen Beetle”ı ve renk olarak “Sarı” yazıp gönderirse, ekranda bu iki değişkeni kullanarak oluşturduğumuz cümleyi görecektir.

Formlarda Çoklu Seçim: Checkbox ve Dizilerin (Array) Kullanımı

Bazen kullanıcının formda tek bir cevap değil, birden çok cevap seçmesini istersiniz. Örneğin kullanıcının hobilerini sormak veya pizzasına eklenecek ekstra malzemeleri seçtirmek isteyebilirsiniz.

Kullanıcı birden fazla seçim yaptığında (örneğin Checkbox’lar ile), bu verileri PHP’de bir dizi (array) olarak yakalamamız gerekir. Bunu HTML tarafında name niteliğinin sonuna köşeli parantezler [] ekleyerek PHP’ye bildiririz.

Pizza Malzemesi Örneği (pizza.html):

<form method="post" action="pizza.php">
  Pizzanız için malzemeleri seçin: <br />
  <!-- İsimlendirmedeki köşeli parantezlere dikkat! -->
  <input type="checkbox" name="toppings[]" value="Domates">Domates</input>
  <input type="checkbox" name="toppings[]" value="Mantar">Mantar</input>
  <input type="checkbox" name="toppings[]" value="Zeytin">Zeytin</input>
  <input type="checkbox" name="toppings[]" value="Sucuk">Sucuk</input>
  <input type="submit" name="submit" value="Siparişi Tamamla" />
</form>

Siparişi İşleme (pizza.php): Form gönderildiğinde, PHP otomatik olarak seçilen tüm değerleri $_POST['toppings'] adlı bir dizinin içine dolduracaktır. Bu dizinin içinde gezinmek ve seçilenleri listelemek için özel olarak diziler için üretilmiş foreach döngüsünü kullanırız.

<?php
echo "Seçtiğiniz malzemeler: <br /><ul>";

// $_POST['toppings'] dizisindeki her bir elemanı $malzeme değişkenine atarak ekrana yazar
foreach ($_POST['toppings'] as $malzeme) {
    echo "<li>$malzeme</li>";
}

echo "</ul>";
?>

Form Doğrulama (Validation) ve Güvenlik

Web geliştirmedeki en meşhur sözlerden biri şudur: “Kullanıcıdan gelen hiçbir veriye asla güvenme!” Kullanıcılar formu boş gönderebilir, yanlış formatta veri girebilir veya sitenizi hacklemek için özel zararlı kodlar (<script> etiketleri vb.) enjekte etmeye çalışabilirler. Verileri veritabanına kaydetmeden veya ekrana basmadan önce mutlaka kontrol edip temizlemeliyiz.

Form girişlerini kontrol ederken şu temel teknikler kullanılır:

  1. Formun Gönderilip Gönderilmediğini Kontrol Etme (isset): Eğer form ile PHP kodunuz aynı sayfadaysa, kodların sadece butona tıklandığında çalışması için formun gönderildiğinden emin olmalısınız. isset() fonksiyonu, bir değişkenin var olup olmadığını kontrol eder. Genellikle submit butonunun varlığı test edilir: if (isset($_POST['submit'])).
  2. Zorunlu Alanların (Boşluk) Kontrolü (empty): Acemi geliştiricilerin sık yaptığı bir hata, zorunlu alanların dolu olup olmadığını kontrol etmemektir. empty() fonksiyonu bir alanın boş bırakılıp bırakılmadığını kontrol eder. Örneğin isim alanı boşsa kullanıcıya uyarı vermek için: if (empty($_POST['username'])).
  3. Gereksiz Boşlukları Temizleme (trim): Kullanıcı bir metin girerken yanlışlıkla boşluk çubuğuna basmış olabilir. Başındaki ve sonundaki boşlukları silmek için trim() fonksiyonu kullanılır.
  4. Metin Uzunluğunu ve Türünü Kontrol Etme: Kullanıcı yaşını soran bir alana yazı mı yazdı, sayı mı? Bunu is_numeric() ile kontrol edebiliriz. Şifresi çok mu kısa? Karakter sayısını strlen() fonksiyonu ile denetleyebiliriz. Çok daha gelişmiş kontroller için (örneğin e-posta adresi formatının veya ISBN numaralarının doğruluğu) düzenli ifadeler yani preg_match() kullanılır.
  5. XSS (Cross-Site Scripting) Saldırılarına Karşı Çıktıyı Temizleme (htmlentities): Kullanıcı bir forum mesajına adını girmek yerine <b> veya <script> gibi HTML/JavaScript etiketleri yazarak sayfanızın yapısını bozmaya çalışabilir. Bunu önlemek için, kullanıcı verilerini ekrana basmadan veya veritabanına almadan önce htmlentities() veya htmlspecialchars() gibi fonksiyonlardan geçirmelisiniz. Bu fonksiyonlar HTML etiketlerini düz metne (zararsız bir formata) dönüştürür.

Kapsamlı ve Güvenli Bir Form Örneği

Tüm öğrendiklerimizi birleştirerek, ad, yazar ve fiyat bilgilerini girmemizi isteyen, aynı zamanda hata kontrolleri yapan tek sayfalık bir kitap kayıt formu hazırlayalım:

<?php
// Hata mesajlarını tutacağımız bir dizi oluşturuyoruz
$hatalar = array();
$mesaj = "";

// Form gönderildiyse işlemlere başla
if (isset($_POST['submit'])) {

    // 1. Kitap Adı Kontrolü (Boş olmamalı ve temizlenmeli)
    if (!empty($_POST['kitap_adi'])) {
        // Boşlukları sil (trim) ve zararlı HTML kodlarını temizle (htmlentities)
        $kitap_adi = htmlentities(trim($_POST['kitap_adi']));
    } else {
        $hatalar[] = "Kitap adı boş bırakılamaz.";
    }

    // 2. Fiyat Kontrolü (Boş olmamalı, sayı olmalı ve 0'dan büyük olmalı)
    if (!empty($_POST['fiyat']) && is_numeric($_POST['fiyat']) && $_POST['fiyat'] > 0) {
        $fiyat = htmlentities(trim($_POST['fiyat']));
    } else {
        $hatalar[] = "Lütfen geçerli bir fiyat giriniz.";
    }

    // Hata yoksa işlemi başarıyla tamamla
    if (count($hatalar) == 0) {
        $mesaj = "Tebrikler! '$kitap_adi' adlı kitap sisteme eklendi. Fiyatı: $fiyat TL";
        // Burada veritabanına kaydetme (INSERT) işlemleri yapılabilir.
    }
}
?>

<!DOCTYPE html>
<html>
<body>
  <h2>Kitap Kayıt Formu</h2>

  <!-- Hatalar varsa kırmızı renkli uyarı olarak göster -->
  <?php if (count($hatalar) > 0): ?>
    <div style="color: red;">
      <?php foreach ($hatalar as $hata) { echo "<p>$hata</p>"; } ?>
    </div>
  <?php endif; ?>

  <!-- Başarı mesajı varsa yeşil olarak göster -->
  <?php if ($mesaj != ""): ?>
    <div style="color: green; font-weight: bold;"><?php echo $mesaj; ?></div>
  <?php endif; ?>

  <!-- Formun action kısmı boş, veriler yine bu sayfaya POST edilecek -->
  <form method="post" action="">
    Kitap Adı: <br />
    <input type="text" name="kitap_adi" /> <br/><br/>

    Fiyat (TL): <br />
    <input type="text" name="fiyat" /> <br/><br/>

    <input type="submit" name="submit" value="Kaydet" />
  </form>
</body>
</html>

Sonuç

PHP’de form işlemleri yapmak, kullanıcılardan veri almak ve dinamik sistemler yaratmak için atılacak en büyük ve eğlenceli adımdır. $_GET ile linkler ve arama motorları üzerinden veri geçişini sağlamayı, $_POST ile güvenli bilgi akışlarını kurmayı, [] (köşeli parantez) yapısıyla checkbox gibi çoklu verileri yakalamayı ve en önemlisi “süzgeç” işlemlerini (isset, empty, trim, htmlentities) projelerinizde bir alışkanlık haline getirmeyi öğrendiniz.

Kullanıcı verilerini doğru şekilde yakalayıp güvenle işleyebildiğinize göre, artık formlardan gelen bu değerli verileri sonsuza dek saklamak ve geri çağırmak üzere bir sonraki aşamaya, yani veritabanı (MySQL/SQLite) dünyasına adım atabilirsiniz!

Etiketlendi:

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir