Menu

PHP $_GET ve $_POST: Sorgu Dizgesi ve Form Verisi Okuma

$_GET URL'nin sorgu dizgesini tutar (?page=2 $_GET['page'] verir), $_POST ise method="post" ile gönderilen bir formun alanlarını tutar. İkisini güvenle okumayı, http_build_query ile bağlantı oluşturmayı, $_SERVER['REQUEST_METHOD'] kontrolünü ve GET ile POST arasında seçim yapmayı öğrenin.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

$_GET URL'nin sorgu dizgesinden oluşan bir dizidir, bu yüzden article.php?id=42&lang=en $_GET['id'] === '42' ve $_GET['lang'] === 'en' verir. $_POST method="post" ile gönderilen bir formun alanlarından oluşan bir dizidir. İkisini de bir varsayılanla okuyun, $_GET['id'] ?? null, çünkü parametre olmadığında anahtar da yoktur.

Bloğu çalıştırın, sonra bağlantılara tıklayın: her tıklama betiği bağlantının sorgu dizgesinden doldurulan $_GET ile yeniden çalıştırır.

$_GET['lang'] yalnızca yazdırdığınız üç bağlantı değil, URL'nin söylediği her şeydir. Herkes adres çubuğuna ?lang=<script> yazabilir; bloğun değeri yazdırmak yerine $languages içinde aramasının ve istek verisini yazdırdığı tek yerde kaçışlamasının nedeni budur.

Sorgu dizgesinden bir sayı okuma

$_GET içindeki her değer bir dizgedir. Bir sayfa numarası için filter_var() ile tek adımda doğrulayın ve dönüştürün, değer eksik, sayı değil veya aralık dışı olduğunda bir varsayılana geri dönün. Sayfalar arasında gezinin, sonra Page 999 ve Page abc bağlantılarını deneyin.

filter_var() "3" için 3 tam sayısını, diğer her dizge için default seçeneğini döndürür, bu yüzden $page her zaman kullanılabilir bir int olur. filter_var sayfası diğer doğrulayıcıları listeler.

$_POST ile form verisi okuma

method="post" içeren bir form alanlarını istek gövdesinde gönderir ve PHP onları her girdinin name değeri altında $_POST içine koyar. $_SERVER['REQUEST_METHOD'] geçerli isteğin ilk ziyaret mi (GET) yoksa bir gönderim mi (POST) olduğunu söyler. İkisini de görmek için formu doldurun ve Send düğmesine basın.

Boş bir metin girdisi de "" olarak gönderilir, bu yüzden bir gönderimden sonra ziyaretçi hiçbir şey yazmamış olsa bile $_POST['title'] vardır. Bir sunucuda REQUEST_METHOD her zaman ayarlıdır; ?? 'GET' yalnızca dosyayı komut satırında php ile çalıştırdığınızda betiği sessiz tutar. Bir formu doğrulama ve yeniden gösterme kalıbının tamamı formlar sayfasında.

method="get" ile bir arama formu

Sonucu paylaşılabilir bir URL olması gereken bir form için, örneğin bir arama kutusu için, GET kullanın. Tarayıcı alanları bir sorgu dizgesine çevirir (?q=sort&level=beginner) ve betik onları tıpkı bir bağlantı gibi $_GET üzerinden okur. array veya string için arama yapın.

http_build_query ile bağlantı oluşturma

"?q=$q&page=2" ifadesini elle yazmak $q bir boşluk, & veya # içerdiği anda bozulur. http_build_query() her değeri sizin için kodlar ve sonuç bir href içine girdiğinde htmlspecialchars() içinden geçer, çünkü HTML içinde & &amp; olmalıdır.

İki argümanlı parse_str() PHP'nin bir sorgu dizgesinden $_GET oluşturma yoludur, bu yüzden test için kullanışlıdır. İkinci argümanı her zaman verin; değişken oluşturan eski tek argümanlı biçim PHP 8'de kaldırıldı.

$_REQUEST ve ondan neden kaçınmalı

$_REQUEST tek bir dizide birleştirilmiş $_GET ve $_POST dizileridir. PHP'nin birlikte gelen php.ini dosyaları request_order = "GP" ayarını yapar, bu yüzden ikisi aynı anahtarı içerdiğinde POST kazanır; o ayar olmadan çerezler de birleştirilir:

<?php
// POST /save.php?id=1 with a form field id=2
echo $_GET['id'];      // "1"
echo $_POST['id'];     // "2"
echo $_REQUEST['id'];  // "2"

Kullanışlı görünür, ama bir değerin nereden geldiğini gizler. $_REQUEST['id'] üzerinden bir kaydı silen bir işleyici düz bir bağlantıyla tetiklenebilir; yalnızca POST ile çalışan eylemlerin önlemesi gereken şey tam olarak budur. Bunun yerine $_GET veya $_POST dizisini adıyla okuyun.

GET ile POST: hangisini kullanmalı

GETPOST
Verinin taşındığı yerURL'de: ?q=php&page=2İstek gövdesinde
Okuma yolu$_GET$_POST
Yer imi, paylaşma, geri düğmesiEvetHayır (tarayıcı yeniden göndermek için sorar)
UzunlukURL ile sınırlı (birkaç bin karakter güvenlidir)post_max_size ile sınırlı (varsayılan 8M)
Dosya yüklemeHayırEvet, enctype="multipart/form-data" ile ($_FILES okuyun)
Kullanım alanıArama, filtreler, sıralama, sayfalamaGiriş, kayıt, kaydetme, silme, ödemeler

Önemli olan kural: bir GET isteği hiçbir şeyi değiştirmemelidir. Tarayıcılar bağlantıları önceden getirir, tarayıcı robotları onları izler ve insanlar onları paylaşır, bu yüzden bir ?delete=5 bağlantısı er geç silmesi amaçlanmamış bir şey tarafından izlenecektir. İki yöntem de kendi başına şifreli değildir: HTTPS ikisini de korur, POST ise yalnızca veriyi URL'nin, tarayıcı geçmişinin ve sunucu loglarının dışında tutar.

Sıkça Sorulan Sorular

PHP'de URL'den bir parametreyi nasıl alırım?

Onu bir varsayılanla $_GET üzerinden okuyun: page.php?id=42 için $id = $_GET['id'] ?? null; "42" dizgesini verir. Her değer bir dizgedir (veya id[]= için bir dizi), bu yüzden onu dönüştürün ve doğrulayın, örneğin filter_var($id, FILTER_VALIDATE_INT) ile.

$_GET ile $_POST arasındaki fark nedir?

$_GET URL'nin sorgu dizgesinden gelir, bu yüzden görünür, yer imlerine eklenebilir ve uzunluğu sınırlıdır; aramalar, filtreler ve sayfalar için kullanın. $_POST method="post" ile gönderilen bir formun istek gövdesinden gelir; kaydetmek, satın almak veya giriş yapmak gibi veriyi değiştiren her şey için kullanın.

PHP'de bir GET parametresinin var olup olmadığını nasıl kontrol ederim?

Anahtar eksik veya null olduğunda false olan isset($_GET['q']) kullanın. Boş bir değeri (?q=) de eksik saymak için kırpılmış değeri karşılaştırın: trim($_GET['q'] ?? '') !== ''.

PHP'de $_REQUEST kullanmalı mıyım?

Genellikle hayır. $_REQUEST $_GET ve $_POST dizilerini (ve request_order ayarına bağlı olarak çerezleri) birleştirir, bu yüzden bir değerin nereden geldiğini anlayamazsınız ve bir bağlantı bir formdan beklediğiniz bir değeri sağlayabilir. $_GET veya $_POST dizisini açıkça okuyun.

PHP'de bir isteğin GET mi POST mu olduğunu nasıl kontrol ederim?

$_SERVER['REQUEST_METHOD'] değerini karşılaştırın: if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }. Bu, düğmenin name özniteliği olmadığında ya da form o alan olmadan JavaScript veya başka bir betik tarafından gönderildiğinde başarısız olan isset($_POST['submit']) kontrolünden daha güvenilirdir.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

BAŞLA