Menu

$_GET dan $_POST PHP: Query String dan Data Form

$_GET berisi query string dari URL (?page=2 menghasilkan $_GET['page']) dan $_POST berisi field form yang dikirim dengan method="post". Pelajari cara membaca keduanya dengan aman, membuat link dengan http_build_query, memeriksa $_SERVER['REQUEST_METHOD'], dan memilih antara GET dan POST.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

$_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.

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 &amp; 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

GETPOST
Tempat data dikirimDi URL: ?q=php&page=2Di body request
Dibaca dengan$_GET$_POST
Bookmark, bagikan, tombol kembaliBisaTidak (browser meminta konfirmasi untuk mengirim ulang)
PanjangDibatasi oleh URL (beberapa ribu karakter masih aman)Dibatasi oleh post_max_size (8M secara default)
Upload fileTidakBisa, dengan enctype="multipart/form-data" (baca $_FILES)
Dipakai untukPencarian, filter, pengurutan, paginasiLogin, 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai