PHP Formdan Veri Alma (GET ve POST)
PHP'de HTML formlarından GET ve POST metodlarıyla veri almayı öğrenin.
PHP'de kullanıcıdan veri almak, web uygulamalarının temel bir işlevidir. Bu genellikle iki ana HTTP metodu aracılığıyla yapılır: **GET** ve **POST**. Her ikisinin de kendine özgü kullanım durumları ve özellikleri vardır.
### PHP'de GET Metodu ile Veri Alma
GET metodu, sunucuya veri göndermenin en basit yoludur. Veriler, URL'nin sonuna parametreler olarak eklenir.
**Nasıl Çalışır?**
1. **Form Kullanımı:** HTML formunda `method="GET"` olarak belirtirsiniz.
2. **URL Parametreleri:** Kullanıcı formu gönderdiğinde, formdaki input alanlarının `name` özniteliklerine sahip değerleri, URL'ye bir soru işareti (?) ile başlanarak `anahtar=değer&anahtar2=değer2` şeklinde eklenir.
3. **PHP'de Erişim:** PHP'de bu verilere `$_GET` süper global dizisi aracılığıyla erişirsiniz. `$_GET` bir ilişkisel dizidir ve URL'deki anahtar-değer çiftlerini içerir.
**Ne Zaman Kullanılır?**
* Arama sorguları (ör: `arama.php?q=php`)
* Filtreleme ve sıralama seçenekleri (ör: `urunler.php?kategori=elektronik&sirala=fiyat`)
* Sayfalama (ör: `makaleler.php?sayfa=2`)
* Kullanıcının belirli bir durumu veya veriyi URL üzerinden paylaşmasını istediğiniz durumlar.
**Avantajları:**
* URL bookmark yapılabilir ve paylaşılabilir.
* Geri düğmesi sorunsuz çalışır.
* Google gibi arama motorları tarafından dizine eklenebilir.
**Dezavantajları:**
* **Güvenlik:** Veriler URL'de görünür olduğu için hassas bilgiler (şifre, kredi kartı vb.) göndermek için uygun değildir.
* **Veri Boyutu Sınırı:** URL'nin uzunluğu tarayıcı ve sunucu tarafından sınırlıdır (genellikle birkaç KB). Çok fazla veri göndermek için uygun değildir.
* **İstek Gövdesi Yok:** Dosya yüklemek için kullanılamaz.
**Örnek Kullanım:**
**1. HTML Formu (`index.html`):**
```html
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>GET Metodu Örneği</title>
</head>
<body>
<h1>GET ile Arama Yap</h1>
<form action="arama.php" method="GET">
<label for="sorgu">Arama Sorgusu:</label><br>
<input type="text" id="sorgu" name="q" placeholder="Anahtar kelime girin"><br><br>
<input type="submit" value="Ara">
</form>
<hr>
<h1>GET ile Sayfalama/Filtreleme Örneği</h1>
<p>URL'yi manuel düzenleyerek de GET parametresi gönderebilirsiniz:</p>
<ul>
<li><a href="sayfa.php?sayfa=1">Sayfa 1</a></li>
<li><a href="sayfa.php?sayfa=2">Sayfa 2</a></li>
<li><a href="sayfa.php?kategori=giyim&sirala=fiyat">Giyim Kategorisi (Fiyata Göre)</a></li>
</ul>
</body>
</html>
```
**2. PHP İşleme Dosyası (`arama.php`):**
```php
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Arama Sonuçları</title>
</head>
<body>
<h1>Arama Sonuçları</h1>
<?php
// 'q' parametresi gönderilmiş mi ve boş değil mi kontrol et
if (isset($_GET['q']) && !empty($_GET['q'])) {
// Kullanıcı girdisini potansiyel XSS saldırılarına karşı temizle
// Ekrana basmadan önce her zaman htmlspecialchars kullanın!
$arama_sorgusu = htmlspecialchars($_GET['q']);
echo "<p>Aradığınız kelime: <strong>" . $arama_sorgusu . "</strong></p>";
// Burada veritabanından veya başka bir kaynaktan arama yapabilirsiniz
} else {
echo "<p>Lütfen bir arama sorgusu girin.</p>";
}
?>
<p><a href="index.html">Geri Dön</a></p>
</body>
</html>
```
**3. PHP İşleme Dosyası (`sayfa.php`):**
```php
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Sayfa İçeriği</title>
</head>
<body>
<h1>Sayfa İçeriği</h1>
<?php
if (isset($_GET['sayfa'])) {
$sayfa_numarasi = (int)$_GET['sayfa']; // Sayfa numarasını integer'a çevir
echo "<p>Şu an <strong>Sayfa " . $sayfa_numarasi . "</strong>'yı görüntülüyorsunuz.</p>";
}
if (isset($_GET['kategori'])) {
$kategori = htmlspecialchars($_GET['kategori']);
echo "<p>Kategori: <strong>" . $kategori . "</strong></p>";
}
if (isset($_GET['sirala'])) {
$sirala = htmlspecialchars($_GET['sirala']);
echo "<p>Sıralama Ölçütü: <strong>" . $sirala . "</strong></p>";
}
if (!isset($_GET['sayfa']) && !isset($_GET['kategori']) && !isset($_GET['sirala'])) {
echo "<p>Herhangi bir GET parametresi bulunamadı.</p>";
}
?>
<p><a href="index.html">Geri Dön</a></p>
</body>
</html>
```
### PHP'de POST Metodu ile Veri Alma
POST metodu, sunucuya veri göndermenin daha güvenli ve kapasiteli bir yoludur. Veriler URL'de görünmez, HTTP isteğinin gövdesinde gönderilir.
**Nasıl Çalışır?**
1. **Form Kullanımı:** HTML formunda `method="POST"` olarak belirtirsiniz.
2. **İstek Gövdesi:** Kullanıcı formu gönderdiğinde, formdaki input alanlarının `name` özniteliklerine sahip değerleri HTTP isteğinin gövdesinde paketlenir ve sunucuya gönderilir.
3. **PHP'de Erişim:** PHP'de bu verilere `$_POST` süper global dizisi aracılığıyla erişirsiniz. `$_POST` da bir ilişkisel dizidir ve gönderilen anahtar-değer çiftlerini içerir.
**Ne Zaman Kullanılır?**
* Kullanıcı girişi (login formları)
* Kayıt formları
* Veritabanına veri ekleme veya güncelleme
* Dosya yükleme (ancak dosya yüklemeleri için `$_FILES` süper globali kullanılır)
* Hassas bilgiler içeren tüm formlar
**Avantajları:**
* **Güvenlik:** Veriler URL'de görünmediği için hassas bilgiler göndermek için daha uygundur (ancak HTTPS kullanmak tam güvenlik sağlar).
* **Veri Boyutu:** Pratik olarak sınırsız veri gönderilebilir.
* **İstek Gövdesi:** Dosya yüklemek için kullanılabilir (formda `enctype="multipart/form-data"` belirtilmelidir).
**Dezavantajları:**
* URL bookmark yapılamaz ve paylaşılamaz.
* Geri düğmesine basıldığında tarayıcı genellikle verileri yeniden göndermek isteyip istemediğinizi sorar.
* Arama motorları tarafından dizine eklenmez.
**Örnek Kullanım:**
**1. HTML Formu (`index.html` - Aynı dosya kullanılabilir, sadece POST formu ekleyin):**
```html
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>POST Metodu Örneği</title>
</head>
<body>
<!-- ... Yukarıdaki GET örnekleri ... -->
<hr>
<h1>POST ile Kullanıcı Kaydı</h1>
<form action="kayit.php" method="POST">
<label for="ad">Adınız:</label><br>
<input type="text" id="ad" name="ad" required><br><br>
<label for="email">E-posta:</label><br>
<input type="email" id="email" name="email" required><br><br>
<label for="sifre">Şifre:</label><br>
<input type="password" id="sifre" name="sifre" required><br><br>
<input type="submit" value="Kayıt Ol">
</form>
</body>
</html>
```
**2. PHP İşleme Dosyası (`kayit.php`):**
```php
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>Kayıt Sonuçları</title>
</head>
<body>
<h1>Kayıt Sonuçları</h1>
<?php
// Form POST metodu ile gönderildi mi kontrol et
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// İsim, e-posta ve şifre parametreleri gönderilmiş mi kontrol et
if (isset($_POST['ad']) && isset($_POST['email']) && isset($_POST['sifre'])) {
// Kullanıcı girdilerini temizle ve doğrula
// XSS saldırılarına karşı htmlspecialchars kullanıyoruz
$ad = htmlspecialchars(trim($_POST['ad']));
$email = htmlspecialchars(trim($_POST['email']));
$sifre = $_POST['sifre']; // Şifre doğrudan kullanılmaz, güvenli bir şekilde hash'lenmelidir!
// Basit bir doğrulama
if (empty($ad) || empty($email) || empty($sifre)) {
echo "<p style='color:red;'>Lütfen tüm alanları doldurun.</p>";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "<p style='color:red;'>Geçerli bir e-posta adresi girin.</p>";
} else {
// Şifreyi asla doğrudan veritabanına kaydetmeyin!
// Gerçek uygulamalarda password_hash() kullanmalısınız:
// $hashed_sifre = password_hash($sifre, PASSWORD_DEFAULT);
echo "<p>Kayıt başarılı!</p>";
echo "<p>Ad: <strong>" . $ad . "</strong></p>";
echo "<p>E-posta: <strong>" . $email . "</strong></p>";
// Şifreyi ekrana basmaktan kaçının! Sadece örnek için gösterilmiştir.
// echo "<p>Şifre (hashlenmeden önce): <strong>" . $sifre . "</strong></p>";
// Burada verileri veritabanına kaydedebilirsiniz.
// ÖNEMLİ: Veritabanına kaydederken SQL Enjeksiyonunu önlemek için PDO veya MySQLi ile Prepared Statements kullanın.
}
} else {
echo "<p style='color:red;'>Formdan gerekli veriler gelmedi.</p>";
}
} else {
echo "<p>Bu sayfaya doğrudan erişilemez. Lütfen formu doldurun.</p>";
}
?>
<p><a href="index.html">Geri Dön</a></p>
</body>
</html>
```
---
### Genel Güvenlik ve En İyi Uygulamalar
1. **`isset()` ve `empty()` Kontrolü:** Her zaman kullanıcıdan gelen bir veriye erişmeden önce `isset()` ile var olup olmadığını ve `empty()` ile boş olup olmadığını kontrol edin. Bu, "Undefined index" hatalarını önler.
```php
if (isset($_POST['ad']) && !empty($_POST['ad'])) {
$ad = $_POST['ad'];
} else {
// Hata mesajı veya varsayılan değer
}
```
2. **Veri Temizliği (Sanitization) ve Doğrulama (Validation):**
* **Temizleme (Sanitization):** Kullanıcıdan gelen veriyi potansiyel kötü amaçlı kodlardan (HTML etiketleri, JavaScript, SQL enjeksiyon karakterleri) arındırmak.
* **XSS Saldırıları İçin:** Kullanıcının girdiği bir değeri HTML olarak sayfada göstermeden önce her zaman `htmlspecialchars()` kullanın.
```php
$temiz_veri = htmlspecialchars($_GET['veri']);
echo "Merhaba " . $temiz_veri;
```
* **Genel Temizleme:** `strip_tags()` veya `filter_var()` fonksiyonları da kullanılabilir.
```php
$temiz_metin = strip_tags($_POST['metin']);
$temiz_sayi = filter_var($_POST['sayi'], FILTER_SANITIZE_NUMBER_INT);
```
* **Doğrulama (Validation):** Verinin beklediğiniz formatta, tipte ve değer aralığında olup olmadığını kontrol etmek.
* `filter_var()` fonksiyonu bu konuda çok güçlüdür.
```php
if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
// Geçerli e-posta
} else {
// Geçersiz e-posta
}
if (filter_var($_POST['yas'], FILTER_VALIDATE_INT, array("options" => array("min_range"=>18, "max_range"=>120)))) {
// Geçerli yaş
}
```
* PHP'nin kendi string fonksiyonları ( `strlen()`, `preg_match()` vb.) da kullanılabilir.
3. **Veritabanı İşlemleri İçin:**
* **SQL Enjeksiyonunu Önleme:** Kullanıcıdan gelen verileri asla doğrudan SQL sorgularına eklemeyin. Her zaman PDO veya MySQLi ile **Prepared Statements** (Hazırlanmış İfadeler) kullanın.
* **Şifreler İçin:** Şifreleri asla düz metin olarak kaydetmeyin. Her zaman `password_hash()` ile hash'leyin ve `password_verify()` ile doğrulayın.
4. **`$_REQUEST` Süper Globali (Dikkatli Kullanım):**
`$_REQUEST` süper globali, hem `$_GET` hem de `$_POST` (ve `$_COOKIE`) verilerini içeren bir dizidir. Ancak, hangi verinin hangi kaynaktan geldiği karışıklığa yol açabileceği ve güvenlik açıkları yaratabileceği için genellikle belirli bir method (`$_GET` veya `$_POST`) kullanmak daha güvenli ve tercih edilen bir yaklaşımdır.
Özetle, PHP'de kullanıcıdan veri almak için `$_GET` ve `$_POST` süper global dizilerini kullanırız. Seçiminiz, gönderdiğiniz verinin hassasiyetine, boyutuna ve URL'de görünüp görünmemesi gerektiğine bağlıdır. Her durumda, güvenlik önlemlerini (`isset()`, `empty()`, `htmlspecialchars()`, `filter_var()`, Prepared Statements) almak kritik öneme sahiptir.
Son Paylaşımlar
-
Python Temelleri Genel Tekrar
14:39:24 - 13/12/2025 -
Python Performans İpuçları
14:38:59 - 13/12/2025 -
Python’da Temiz Kod Yazma
14:38:28 - 13/12/2025 -
Python Mini Proje: Sayı Tahmin Oyunu
14:37:58 - 13/12/2025 -
Python Mini Proje: Hesap Makinesi
14:37:31 - 13/12/2025