- Konu sahibi
- #1
İstek URL’sindeki sorgu parametrelerini PHP’de almak için
Bir URL’de
Bu dosyaya şu URL ile istek gönderildiğinde:
URL’de
URL parametreleri kullanıcı tarafından değiştirilebilir. Bu nedenle
URL’den gelen parametreler için
Bir URL’de
Aynı isimli parametreleri dizi olarak göndermek için köşeli parantez kullanılabilir:
Bu istekte değerler
Özetle, URL sorgu parametrelerini
$_GET süper küresini kullanabilirsiniz. Örneğin urun.php?id=42&kategori=kitap adresinde id ve kategori değerleri sırasıyla $_GET['id'] ve $_GET['kategori'] ile okunur. Parametrenin gönderilmediği durumda hata almamak için isset() veya null birleştirme işleci (??) kullanılmalı; kullanıcıdan gelen değer doğrudan güvenilir kabul edilmeden doğrulanıp uygun şekilde işlenmelidir.URL parametresini alma
Bir URL’de
? işaretinden sonra başlayan bölüm sorgu dizesidir. Parametreler anahtar=değer biçiminde yazılır ve birden fazla parametre & ile ayrılır. Aşağıdaki varsayımsal örnekte PHP dosyasının adı urun.php olsun:
PHP:
<?php
$id = $_GET['id'] ?? null;
$kategori = $_GET['kategori'] ?? null;
if ($id === null) {
exit('Ürün numarası gönderilmedi.');
}
if (!ctype_digit((string) $id)) {
exit('Ürün numarası geçersiz.');
}
$id = (int) $id;
$kategori = $kategori !== null
? trim((string) $kategori)
: null;
echo 'Ürün ID: ' . $id . PHP_EOL;
echo 'Kategori: ' . ($kategori ?? 'Belirtilmedi');
Bu dosyaya şu URL ile istek gönderildiğinde:
urun.php?id=42&kategori=kitap$_GET['id'] değeri 42, $_GET['kategori'] değeri ise kitap olur. Örnekte id önce gönderilip gönderilmediği açısından kontrol ediliyor, sonra yalnızca rakamlardan oluştuğu doğrulanıyor ve tamsayıya dönüştürülüyor. Böylece beklenen veri alınmadığında veya farklı bir değer gönderildiğinde işlem kontrollü biçimde duruyor.Parametre gönderilmemişse ne olur?
$_GET['olmayan_parametre'] ifadesini doğrudan kullanmak, parametre gönderilmediğinde uyarıya yol açabilir. Bu nedenle genellikle şu kullanım tercih edilir:
PHP:
$sayfa = $_GET['sayfa'] ?? 1;
URL’de
sayfa yoksa $sayfa değeri 1 olur. Parametre gönderilmiş olsa bile boş bir değer kabul edilip edilmeyeceğine ayrıca karar vermelisiniz. Örneğin ?sayfa= gönderildiğinde anahtar vardır, ancak değer boştur. Bu durum için isset() tek başına yeterli bir iş kuralı kontrolü olmayabilir; değeri aldıktan sonra sayı aralığını ve beklenen biçimi de denetlemek gerekir.Metin ve sayısal değerleri doğrulama
URL parametreleri kullanıcı tarafından değiştirilebilir. Bu nedenle
id, sayfa, limit gibi sayısal değerlerde beklenen türü doğrulayın; metin değerlerinde ise izin verilen seçenekleri sınırlandırın.
PHP:
$sirala = $_GET['sirala'] ?? 'yeni';
$izin_verilenler = ['yeni', 'eski', 'fiyat'];
if (!in_array($sirala, $izin_verilenler, true)) {
$sirala = 'yeni';
}
echo htmlspecialchars($sirala, ENT_QUOTES, 'UTF-8');
htmlspecialchars() çıktıyı HTML içinde gösterirken özel karakterlerin kod olarak yorumlanmasını önler. Bu işlem veriyi doğrulamanın yerine geçmez; yalnızca HTML çıktısına yazma aşamasındaki güvenlik ihtiyacını karşılar. Veritabanı sorgularında ise ayrıca hazırlanmış ifadeler kullanılmalıdır. Kullanıcıdan gelen değeri SQL sorgusuna metin birleştirme ile eklemek güvenli değildir.GET ile POST arasındaki fark
URL’den gelen parametreler için
$_GET, form gövdesiyle gönderilen ve URL’de görünmemesi istenen form verileri için çoğunlukla $_POST kullanılır. GET değerleri tarayıcı geçmişinde, yer imlerinde ve sunucu günlüklerinde görünebilir; bu nedenle parola, erişim anahtarı veya başka hassas bilgileri URL’ye koymayın.| Gönderim türü | PHP’de erişim | Uygun kullanım |
|---|---|---|
| GET | $_GET | Arama, filtreleme, sayfalama ve belirli bir kaynağı seçme |
| POST | $_POST | Form gönderme veya URL’de görünmemesi gereken normal form verileri |
id bulunması, kaydın gerçekten var olduğunu veya kullanıcının bu kayda erişme yetkisi olduğunu kanıtlamaz. PHP kodu önce parametreyi biçim açısından doğrulamalı, ardından veritabanında kaydı aramalı ve yetki kontrolü yapmalıdır. Kayıt bulunamazsa uygun bir hata yanıtı; kullanıcı yetkili değilse erişim reddi üretilmelidir.Dizi biçimindeki parametreleri alma
Aynı isimli parametreleri dizi olarak göndermek için köşeli parantez kullanılabilir:
urun.php?etiket[]=php&etiket[]=webBu istekte değerler
$_GET['etiket'] içinde dizi olarak bulunur. Beklenen veri gerçekten dizi mi diye kontrol etmeden üzerinde döngü kurmayın:
PHP:
$etiketler = $_GET['etiket'] ?? [];
if (!is_array($etiketler)) {
$etiketler = [];
}
foreach ($etiketler as $etiket) {
$etiket = trim((string) $etiket);
echo htmlspecialchars($etiket, ENT_QUOTES, 'UTF-8') . '<br>';
}
Özetle, URL sorgu parametrelerini
$_GET ile alın; eksik değerler için varsayılan belirleyin, her girdiyi beklenen türe ve değere göre doğrulayın, HTML’ye yazarken kaçış uygulayın ve kimlik doğrulama ile yetki kontrolünü yalnızca URL’deki parametreye bırakmayın.