İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

PHP Form İşleme Nasıl Yapılır? POST ve GET Kullanımı

php-form-isleme-nasil-yapilir-post-ve-get-kullanimi
Bu yazıda neler var?
  1. HTML formunda action, method ve name ne işe yarar?
  2. GET ve POST arasındaki fark nedir, hangisi seçilir?
  3. Ad ve sınıf alanlarıyla çalışan POST örneği
  4. Veriyi doğrulamak ve HTML çıktısını korumak neden ayrı işlemlerdir?
  5. Form çalışmıyorsa adım adım nasıl teşhis edilir?

php form işleme nasıl yapılır sorusunun temel cevabı, tarayıcıdaki formun veriyi belirlenen HTTP yöntemiyle PHP dosyasına göndermesi, PHP’nin bu veriyi sunucu tarafında okuyup kontrol etmesi ve sonucu HTML bağlamına uygun şekilde üretmesidir. Kullanıcı formu gönderir, sunucu isteği işler ve yeni yanıtı tarayıcıya döndürür.

Bu akışta action isteğin hedefini, method gönderim biçimini, form alanlarının name değerleri ise PHP’de okunacak anahtarları belirler. GET veya POST seçimi verinin nasıl kullanılacağına göre yapılır, ancak seçilen yöntem tek başına doğrulama ya da güvenlik sağlamaz.

HTML formunda action, method ve name ne işe yarar?

Örnekte dosyanın adı form.php olacak. Bu dosyayı PHP çalıştırabilen bir geliştirme sunucusu üzerinden açmalısın. Dosyayı doğrudan bilgisayarındaki dosya yoluyla açmak yerine, tarayıcıda geliştirme sunucusunun verdiği adresi kullanmalısın. Form işaretlemesiyle işlem kodunun aynı form.php dosyasında bulunması, gönderim ve yanıt akışını tek yerde görmeni sağlar.

Form gönderildiğinde tarayıcı, action değerini isteğin hedefi olarak kullanır ve method değerine göre HTTP isteğini oluşturur. Aynı dosyaya gönderim yapılacağı için action="form.php" kullanıldığında istek yine bu PHP dosyasına ulaşır. method="post" ise form verisinin POST isteğiyle gönderileceğini belirtir.

  • action: Form verisinin hangi URL’ye veya PHP dosyasına gönderileceğini belirtir.
  • method: Verinin GET ya da POST gibi hangi HTTP yöntemiyle taşınacağını belirler.
  • name: Her form alanının sunucuya gönderilen veri içindeki anahtarını verir. PHP bu anahtarı kullanarak değere ulaşır.

Ana örnekte form hedefi form.php, gönderim yöntemi post, alan anahtarları ise ad ve sinif olacak. Bu nedenle POST isteği alındığında PHP tarafında değerler $_POST['ad'] ve $_POST['sinif'] anahtarlarıyla aranır.

id ile name aynı değere sahip olabilir, fakat görevleri farklıdır. id, HTML belgesindeki öğeyi benzersiz biçimde tanımlamak, <label for> bağlantısı kurmak ve CSS ya da JavaScript tarafından öğeye erişmek için kullanılır. PHP’nin $_POST veya $_GET içindeki anahtarı belirlemesini sağlayan öznitelik ise name değeridir. Bu nedenle yalnızca id="ad" yazmak, ilgili değerin otomatik olarak $_POST['ad'] içinde bulunacağı anlamına gelmez.

GET ve POST arasındaki fark nedir, hangisi seçilir?

GET ve POST arasındaki fark nedir, hangisi seçilir?

GET ve POST arasında seçim yaparken kullanım amacına, form alanlarının URL’de görünüp görünmemesine ve verinin istekte nerede taşındığına bakabilirsin. Standart HTML formunda GET, verileri action adresinin sorgu kısmına ekler. POST ise form verisini HTTP isteğinin gövdesine taşır.

ölçüt GET POST
Kullanım amacı Arama, filtreleme ve paylaşılabilir sorgu sonuçları Veriyi sunucuda işleme, kaydetme veya bir işlem başlatma
Form alanlarının URL’de görünürlüğü Alan adları ve değerleri URL’nin sorgu kısmında görünür Form alanları normal gönderimde adres çubuğuna eklenmez
Verinin taşındığı yer İsteğin hedef URL’sindeki sorgu dizesi HTTP isteğinin gövdesi

Arama veya filtreleme parametreleri sonuç adresinin bir parçası olacaksa GET kullanmak uygundur. Böylece sorgu adresi saklanabilir ya da paylaşılabilir. Ad ve sınıf örneğinde ise POST seçiyoruz, çünkü bu değerleri URL’nin parçası hâline getirmeden PHP dosyasına göndermek istiyoruz. POST’un alanları adres çubuğunda göstermemesi, tek başına güvenlik sağlamaz; sunucu tarafı doğrulama ve uygun çıktı işlemleri yine yapılmalıdır.

PHP, URL sorgu dizesindeki değerleri $_GET, standart form kodlamasıyla gönderilen POST verilerini ise $_POST adlı ilişkisel dizilerde sunar. Bu dizilerdeki anahtarlar form alanlarının name değerlerinden gelir. Standart metin alanlarından oluşan bir POST formunda veriler genellikle application/x-www-form-urlencoded biçiminde isteğin gövdesine yerleştirilir.

arama.php?ad=Deniz isteğini karşılayan kısa bir GET örneği şöyle olabilir:

<?php
$ad = $_GET['ad'] ?? '';

if (is_string($ad)) {
    echo htmlspecialchars($ad, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
} else {
    echo 'Geçersiz ad';
}
?>

Önemli satırlar: $_GET['ad'] ?? '', sorgu dizesindeki ad değerini okur. is_string($ad), gelen değerin metin olup olmadığını kontrol eder. Örneğin ad[]=Deniz gibi dizi biçiminde bir değer gönderilirse Geçersiz ad mesajı gösterilir. Değer metinse htmlspecialchars, HTML içinde özel anlam taşıyan karakterleri HTML varlıklarına dönüştürür. ENT_QUOTES çift ve tek tırnakları, ENT_SUBSTITUTE ise geçersiz karakter dizilerini uygun bir değiştirme karakteriyle ele alır.

Beklenen çıktı: Deniz

URL kodlama, URL içinde özel anlam taşıyan karakterleri taşınabilir bir gösterime dönüştürür; şifreleme değildir ve veriyi gizli hâle getirmez. Bu yüzden GET ile gönderilen bilgileri gizli kabul etmemelisin. Karakterlerin kodlanmış ve çözülmüş hâllerini karşılaştırmak için URL kodlama ve çözme aracını kullanabilirsin.

Ad ve sınıf alanlarıyla çalışan POST örneği

Ad ve sınıf alanlarıyla çalışan POST örneği

Aşağıdaki tek dosyalı örneği form.php adıyla kaydedebilirsin. Form kendisine POST gönderir. İlk sayfa açılışında $_SERVER['REQUEST_METHOD'] kontrolü sayesinde doğrulama çalışmaz. name değerleri, PHP tarafında $_POST['ad'] ve $_POST['sinif'] anahtarlarıyla okunur.

<?php
$hata = '';
$mesaj = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $adGirdisi = $_POST['ad'] ?? '';
    $sinifGirdisi = $_POST['sinif'] ?? '';

    if (!is_string($adGirdisi) || !is_string($sinifGirdisi)) {
        $hata = 'Geçersiz form verisi.';
    } else {
        $ad = trim($adGirdisi);
        $sinifMetni = trim($sinifGirdisi);

        if ($ad === '' || $sinifMetni === '') {
            $hata = 'Ad ve sınıf alanlarını doldurmalısın.';
        } else {
            $sinifSonucu = filter_var(
                $sinifMetni,
                FILTER_VALIDATE_INT,
                ['options' => ['min_range' => 1]]
            );

            if ($sinifSonucu === false) {
                $hata = 'Sınıf bilgisi pozitif bir tam sayı olmalıdır.';
            } else {
                $sinif = (int) $sinifSonucu;
                $adHtml = htmlspecialchars(
                    $ad,
                    ENT_QUOTES | ENT_SUBSTITUTE,
                    'UTF-8'
                );
                $mesaj = "Merhaba {$adHtml}, sınıfın: {$sinif}.";
            }
        }
    }
}
?>
<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <title>Ad ve sınıf formu</title>
</head>
<body>
    <h1>Ad ve sınıf formu</h1>

    <?php if ($hata !== ''): ?>
        <p><?php echo htmlspecialchars($hata, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); ?></p>
    <?php endif; ?>

    <?php if ($mesaj !== ''): ?>
        <p><?php echo $mesaj; ?></p>
    <?php endif; ?>

    <form action="form.php" method="post">
        <label for="ad">Ad</label>
        <input type="text" id="ad" name="ad" required>

        <label for="sinif">Sınıf</label>
        <input type="number" id="sinif" name="sinif" min="1" step="1" required>

        <button type="submit">Gönder</button>
    </form>
</body>
</html>

Kodun önemli noktaları

  • $_SERVER['REQUEST_METHOD'] === 'POST' koşulu, doğrulama kodunun yalnızca form gönderildiğinde çalışmasını sağlar.
  • ?? '', gönderilmeyen alanlar için boş metin kullanır. trim() çağrısından önce yapılan is_string() kontrolü, alanın beklenmeyen bir dizi olarak gelmesi durumunda işlemi durdurur. PHP form değişkenlerini dizi biçiminde de oluşturabildiği için bu kontrol önemlidir.
  • trim() çevredeki boşlukları temizler. Ardından === '' ile adın veya sınıf bilgisinin boş olup olmadığı kontrol edilir.
  • FILTER_VALIDATE_INT sınıf bilgisini tamsayı olarak doğrular. min_range => 1 bu örnekteki kuralı, yani pozitif tamsayı şartını ifade eder. Başarısız sonuç === false ile ayırt edilir; başarılı sonuç ise zaten tamsayıdır.
  • (int) dönüşümü doğrulamadan sonra açıkça gösterilmiştir. Doğrudan tür dönüşümü tek başına geçerlilik kontrolü değildir. Ad HTML metnine aktarılmadan önce htmlspecialchars() ile işlenir, doğrulanmış sınıf ise tamsayı olarak yazdırılır.

Ad olarak Deniz ve sınıf olarak 10 gönderildiğinde beklenen çıktı Merhaba Deniz, sınıfın: 10. olur. Boş alanlarda Ad ve sınıf alanlarını doldurmalısın., geçersiz sınıf bilgisinde Sınıf bilgisi pozitif bir tam sayı olmalıdır., beklenmeyen veri türünde ise Geçersiz form verisi. mesajı gösterilir.

Veriyi doğrulamak ve HTML çıktısını korumak neden ayrı işlemlerdir?

Form verisini almak, onu güvenilir kabul etmek anlamına gelmez. Sunucu tarafı doğrulaması, verinin uygulama kuralına uygun olup olmadığını denetler. Çıktı kaçışlaması ise gösterilecek metnin HTML etiketi gibi yorumlanmasını sınırlamayı amaçlar. Bu nedenle veri alma, doğrulama ve HTML çıktısı için güvenli biçime dönüştürme ayrı adımlar olarak düşünülmelidir.

Örnekte FILTER_VALIDATE_INT sınıf bilgisinin kuralına uygunluğunu kontrol eder. htmlspecialchars() ise özellikle &, <, >, tek tırnak ve çift tırnak gibi HTML açısından özel anlam taşıyan karakterleri entity biçimine dönüştürür. ENT_QUOTES iki tür tırnağın da dönüştürülmesini, ENT_SUBSTITUTE geçersiz karakter dizilerinin yerine uygun bir değiştirme karakteri konmasını sağlar. 'UTF-8' parametresi kullanılacak karakter kodlamasını açıkça belirtir.

Ad alanına Deniz <strong>Test</strong>, sınıf alanına 10 girersen tarayıcıda Merhaba Deniz <strong>Test</strong>, sınıfın: 10. metni görünür. Buradaki etiketler çalışmaz ve <strong>Test</strong> kalınlaşmaz. Bu kullanım HTML metni bağlamına yöneliktir. htmlspecialchars() JavaScript, URL veya SQL bağlamları için otomatik ve genel bir çözüm olarak görülmemelidir.

Bu formdaki POST verisinin adres çubuğunda görünmemesi, alanların URL sorgusuna değil istek gövdesine gönderilmesiyle ilgilidir; şifreleme anlamına gelmez. Aktarım sırasında gizlilik için HTTPS ve TLS kullanılır. required ile type="number" gibi tarayıcı kontrolleri kullanıcıya erken geri bildirim sağlayabilir, ancak sunucuya gelen veriler PHP tarafında yeniden doğrulanmalıdır.

Form çalışmıyorsa adım adım nasıl teşhis edilir?

Formu rastgele değiştirmek yerine, isteğin tarayıcıdan PHP koduna ulaşıp ulaşmadığını ve sunucunun hangi veriyi aldığını şu sırayla kontrol et:

  1. PHP dosyasını sunucu üzerinden aç. Dosyayı doğrudan bilgisayardan açtığında PHP kodu çalışmayabilir. PHP etiketleri tarayıcıda metin olarak görünüyorsa dosyayı PHP çalıştıran yerel sunucu adresinden açmalısın.
  2. action hedefini kontrol et. Gönderimden sonra 404 veya yanlış bir sayfa görüyorsan formdaki hedef dosyanın adı ya da yolu hatalıdır. Doğru dosya açılıyor, fakat veri işlenmiyorsa sonraki adımlara geç.
  3. method ile kullanılan süper globali eşleştir. method="post" için $_POST, method="get" için $_GET kullanılmalıdır. POST gönderip $_GET kontrol edersen alanlar yokmuş gibi davranabilir.
  4. name anahtarlarını kontrol et. Form alanlarında ana örnekteki gibi name="ad" ve name="sinif" bulunmalıdır. id veya label metni, PHP tarafında gönderilecek anahtarı oluşturmaz. Yazım hatası ya da eksik name kullanımı beklenen verinin gelmemesine neden olur.
  5. Gelen verinin türünü sınayarak gönder. Yerel testte required, min, max ve step gibi tarayıcı kısıtlarını geçici olarak kaldırabilir veya değiştirebilirsin. Böylece sunucu doğrulamasını sınarsın. Örneğin name="ad[]" gönderimi, ad değerini diziye dönüştürür. Ana örnek dize beklediği için beklenen sonuç Geçersiz veri. mesajıdır.
  6. Doğrulama sonucunu incele. Ad veya sınıf boş bırakıldığında Eksik alan. mesajı görünmelidir. Sınıf alanına 10abc, 0, -2 veya 3.5 gönderildiğinde ana örnekteki tamsayı ve aralık kontrolü nedeniyle Geçersiz sınıf. mesajı beklenir.
  7. Çıktının HTML metni olarak gösterildiğini kontrol et. Ad alanına <b>Ayşe</b> yazıldığında metin kalınlaşmamalı, sayfada <b>Ayşe</b> olarak görünmelidir. Bunun için geçerli ad, HTML çıktısına eklenmeden önce htmlspecialchars ile dönüştürülür.

Bu sırayı izlemek, sorunun formdan, istek yönteminden, gelen verinin türünden, doğrulamadan veya HTML çıktısından kaynaklanıp kaynaklanmadığını ayırmayı kolaylaştırır.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara