$_GET adalah array dari query string URL, jadi article.php?id=42&lang=en menghasilkan $_GET['id'] === '42' dan $_GET['lang'] === 'en'. $_POST adalah array dari field-field form yang dikirim dengan method="post". Baca keduanya dengan nilai default, $_GET['id'] ?? null, karena key-nya tidak ada setiap kali parameternya tidak ada.
Jalankan blok ini, lalu klik link-linknya: setiap klik menjalankan script lagi dengan $_GET yang diisi dari query string link tersebut.
$_GET['lang'] berisi apa pun yang tertulis di URL, bukan hanya tiga link yang kamu cetak. Siapa pun bisa mengetik ?lang=<script> di address bar, itulah sebabnya blok ini mencari nilainya di $languages alih-alih mencetaknya, dan melakukan escape di satu-satunya tempat yang mencetak data request.
Membaca angka dari query string
Setiap nilai di $_GET berupa string. Untuk nomor halaman, validasi dan konversi dalam satu langkah dengan filter_var(), lalu pakai nilai default saat nilainya tidak ada, bukan angka, atau di luar rentang. Klik halaman-halamannya, lalu coba link Page 999 dan Page abc.
filter_var() mengembalikan integer 3 untuk "3" dan nilai opsi default untuk string lainnya, jadi $page selalu berupa int yang bisa dipakai. Halaman filter_var mencantumkan validator lainnya.
Membaca data form dengan $_POST
Form dengan method="post" mengirim field-nya di body request, dan PHP memasukkannya ke $_POST di bawah name setiap input. $_SERVER['REQUEST_METHOD'] memberi tahu apakah request saat ini adalah kunjungan pertama (GET) atau submit (POST). Isi form-nya lalu tekan Send untuk melihat keduanya.
Input teks yang kosong tetap dikirim, sebagai "", jadi setelah submit $_POST['title'] tetap ada meskipun pengunjung tidak mengetik apa pun. Di server, REQUEST_METHOD selalu terisi; ?? 'GET' hanya membuat script tetap tenang saat kamu menjalankan file dengan php di command line. Pola lengkap untuk memvalidasi dan menampilkan ulang form ada di halaman form.
Form pencarian dengan method="get"
Pakai GET untuk form yang hasilnya sebaiknya berupa URL yang bisa dibagikan, seperti kotak pencarian. Browser mengubah field-field menjadi query string (?q=sort&level=beginner) dan script membacanya dari $_GET, persis seperti link. Coba cari array atau string.
Membuat link dengan http_build_query
Menulis "?q=$q&page=2" secara manual akan rusak begitu $q berisi spasi, &, atau #. http_build_query() meng-encode setiap nilai untukmu, dan hasilnya melewati htmlspecialchars() saat dimasukkan ke href, karena & seharusnya ditulis & di dalam HTML.
parse_str() dengan dua argumen adalah cara PHP membuat $_GET dari query string, jadi berguna untuk pengujian. Selalu berikan argumen kedua; bentuk lama dengan satu argumen yang membuat variabel sudah dihapus di PHP 8.
$_REQUEST dan kenapa sebaiknya dihindari
$_REQUEST adalah $_GET dan $_POST yang digabung menjadi satu array. File php.ini bawaan PHP mengatur request_order = "GP", jadi saat keduanya berisi key yang sama, POST yang menang; tanpa pengaturan itu, cookie juga ikut digabungkan:
<?php
// POST /save.php?id=1 with a form field id=2
echo $_GET['id']; // "1"
echo $_POST['id']; // "2"
echo $_REQUEST['id']; // "2"
Kelihatannya praktis, tetapi ini menyembunyikan dari mana sebuah nilai berasal. Handler yang menghapus record berdasarkan $_REQUEST['id'] bisa dipicu oleh link biasa, padahal justru itulah yang ingin dicegah oleh aksi yang hanya menerima POST. Baca $_GET atau $_POST berdasarkan namanya.
GET vs POST: mana yang dipakai
| GET | POST | |
|---|---|---|
| Tempat data dikirim | Di URL: ?q=php&page=2 | Di body request |
| Dibaca dengan | $_GET | $_POST |
| Bookmark, bagikan, tombol kembali | Bisa | Tidak (browser meminta konfirmasi untuk mengirim ulang) |
| Panjang | Dibatasi oleh URL (beberapa ribu karakter masih aman) | Dibatasi oleh post_max_size (8M secara default) |
| Upload file | Tidak | Bisa, dengan enctype="multipart/form-data" (baca $_FILES) |
| Dipakai untuk | Pencarian, filter, pengurutan, paginasi | Login, daftar, menyimpan, menghapus, pembayaran |
Aturan yang paling penting: request GET tidak boleh mengubah apa pun. Browser melakukan prefetch pada link, crawler mengikutinya, dan orang membagikannya, jadi link ?delete=5 pada akhirnya akan diikuti oleh sesuatu yang tidak bermaksud menghapus. Tidak satu pun dari kedua method ini terenkripsi dengan sendirinya: HTTPS melindungi keduanya, dan POST hanya menjauhkan data dari URL, riwayat browser, dan log server.
Pertanyaan yang sering diajukan
Bagaimana cara mengambil parameter dari URL di PHP?
Baca dari $_GET dengan nilai default: untuk page.php?id=42, $id = $_GET['id'] ?? null; menghasilkan string "42". Setiap nilai berupa string (atau array untuk id[]=), jadi konversi dan validasi nilainya, misalnya dengan filter_var($id, FILTER_VALIDATE_INT).
Apa perbedaan $_GET dan $_POST?
$_GET berasal dari query string URL, jadi terlihat, bisa di-bookmark, dan panjangnya terbatas; pakai untuk pencarian, filter, dan halaman. $_POST berasal dari body request sebuah form yang dikirim dengan method="post"; pakai untuk apa pun yang mengubah data, seperti menyimpan, membeli, atau login.
Bagaimana cara mengecek apakah parameter GET ada di PHP?
Pakai isset($_GET['q']), yang bernilai false jika key-nya tidak ada atau bernilai null. Agar nilai kosong (?q=) juga dianggap tidak ada, bandingkan nilai yang sudah di-trim: trim($_GET['q'] ?? '') !== ''.
Perlukah saya memakai $_REQUEST di PHP?
Biasanya tidak. $_REQUEST menggabungkan $_GET dan $_POST (dan, tergantung request_order, cookie), sehingga kamu tidak bisa tahu dari mana sebuah nilai berasal, dan sebuah link bisa memberikan nilai yang kamu harapkan datang dari form. Baca $_GET atau $_POST secara eksplisit.
Bagaimana cara mengecek apakah request berupa GET atau POST di PHP?
Bandingkan $_SERVER['REQUEST_METHOD']: if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }. Cara ini lebih andal daripada isset($_POST['submit']), yang gagal saat tombolnya tidak punya name atau saat form dikirim oleh JavaScript atau script lain tanpa field itu.