Dalam dunia internet, protokol yang umum digunakan adalah protokol HTTP, protokol ini memiliki beberapa metode request (request method) diantaranya adalah dari GET dan POST, jadi GET dan POST ini berdiri sendiri tidak berhubungan dengan bahasa pemrograman seperti PHP dan ASP, sehingga jika kita membicarakan GET dan POST pada PHP, maka sebenarnya kita sedang membicarakan GET dan POST pada HTTP.
Dalam berkomunikasi, PHP menggunakan ptorokol HTTP (ya memang karena php merupakan bahas pemrograman berbasis web), oleh karena itu PHP juga menyediakan sarana untuk berinteraksi dengan kedua metode request tersebut yaitu: (1) menyimpan data GET dan POST dan (2) mengirim data GET dan POST.
Pada artikel kali ini kita hanya akan membahas yang nomor 1, pembahasan kali terdiri dari beberapa bagian:
- GET pada HTTP dan $_GET pada PHP
- POST pada HTTP dan $_POST pada PHP
- Kapan Menggunakan GET dan Kapan Menggunakan POST
- $_REQUEST pada PHP
Get dan Post Pada PHP dan HTTP
1. GET pada HTTP dan $_GET pada PHP
Dalam bahasa inggris kita akrab dengan istilah GETting, dari istilah tersebut dapat diartikan bahwa metode GET pada HTTP ditujukan untuk mengambil (get) data dari server.
Pada metode ini umumnya data berbentuk query string yang dikirim via url, data tersebut berupa pasangan key=value
yang dipisahkan dengan tanda &
. Data tersebut digabung dengan url utama yang dipisahkan dengan tanda ?
Sebelum dikirim, terlebih dahulu data diproses sehingga memenuhi standar format URL. URL hanya boleh memuat huruf (besar dan kecil), angka, dan beberapa karakter lain dalam ASCII Character Set seperti (“.-_~), karakter di luar itu akan diubah ke format tertentu yang diawali tanda %
kemudian diikuti dengan 2 digit hexadesimal, contoh:
Karakter | URL Encoded |
---|---|
? | %3F |
@ | %40 |
= | %3D |
angka pada kolom (URL Encoded) merupakan nilai hexadecimal dari character ASCII, disamping itu URL juga tidak boleh memuat spasi, sehingga spasi akan diubah menjadi tanda +
atau %20
. Semua proses tersebut disebut url encoding.
Berikut ini merupakan contoh penggunaan metode GET pada form. Kita buat file registrasi.php dan tuliskan kode HTML berikut ini:
<html>
<body>
<form method="GET" action="">
<input type="text" name="nama"><br>
<input type="text" name="email"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html>
setelah itu simpan dan jalankan pada browser, pada field yang muncul, misal kita isikan nama: Agus Prawoto Hadi, email: prawoto.hadi@gmail.com, jika kita klik Submit, maka browser akan mengirim request dengan bentuk seperti gambar berikut ini:
dari gambar diatas terlihat bahwa metode yang kita gunakan adalah GET disertai query string nya, disamping itu url pada browser juga akan berubah menjadi:
https://jagowebdev.com/?nama=Agus+Prawoto+Hadi&email=prawoto%40gmail.com&submit=submit
dari data diatas terlihat bahwa <spasi> baik pada query string maupun pada url diencode menjadi tanda + dan @ menjadi %40. Ketika kita ambil data tersebut dengan PHP maka otomatis data pada url akan didecode sehingga kita dapatkan bentuk asli dari data yang kita kirim, mari kita tambahkan kode pada file registrasi.php, sehingga menjadi:
<html>
<body>
<form method="GET" action="">
<input type="text" name="nama"><br>
<input type="text" name="email"><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
if ($_GET)
{
echo 'Nama: ' . $_GET['nama'];
echo '<br>';
echo 'Email: ' . $_GET['email'];
}
?>
</body>
</html>
ketika kita refresh browser maka akan kita dapatkan hasil:
Nama: Agus Prawoto Hadi Email: prawoto.hadi@gmail.com
Variabel $_GET pada PHP berbentuk associative array. Variabel ini bentuknya sama seperti variabel pada umumnya, bedanya $_GET ini merupakan variabel globlal sehingga bisa diaksess dimana saja.
Karena bentuknya sama dengan yang lain, variabel ini dapat kita manipulasi sebagaimana kita memanipulasi variabel array lainnya, misal dengan menambahkan nilainya: $_GET['status'] = 'aktif'
atau menghapusnya unset($_GET['nama'])
Kelebihan dan Kekurangan
Terdapat beberapa kelebihan penggunaan metode GET, diantaranya adalah:
- Simpel, dan data mudah diedit, misal untuk menuju halaman 5 dari suatu website, kita tinggal mengganti urlnya.
- Halaman dapat dibookmark dan disimpan pada history browser sehingga mudah untuk diakses kembali.
- Dapat kembali ke halaman sebelumnya dengan mudah (dengan mengklik tombol Back pada browser).
- Dapat direfresh dengan mudah.
- Dapat di distribusikan/dishare.
Meskipun banyak kelebihannya, penggunaan metode ini memiliki beberpa kelemahan yaitu:
- Panjang data terbatas hanya 2kb – 8kb (tergantung browsernya), jika melebihi batas tersebut akan muncul pesan error
414 Request-URI Too Long,
sehingga tidak dapat digunakan untuk mengirim data dalam jumlah besar. - Hanya dapat mengirim data jenis teks, jenis lainnya seperti: gambar, file zip, dll tidak dapat dikirim.
- Karena data dikirim via URL, data tersebut mudah terekspose.
2. POST pada HTTP dan $_POST pada PHP
Kita sering mendengar istilah post, yang biasanya terkait dengan POSTing ke sosial media, dimana pada kegiatan tersebut kita mengirim data berupa tulisan atau gambar untuk disimpan di server sosial media tersebut.
Begitu juga dengan istilah POST pada HTTP, POST digunakan untuk mengirim data yang biasanya di gunakan untuk menambah/merubah data pada server.
Pada protokol HTTP, metode POST dapat dikirim baik melalui query string maupun body, seperti pada GET, data yang dikirim melalui query string akan ditampilkan pada URL dan sedangkan yang dikirim melalui body tidak terlihat oleh user.
Pada PHP, data POST yang dikirim melalui query string disimpan pada variabel $_GET (seperti metode GET) sedangkan yang dikirim melalui body disimpan pada variabel $_POST.
Sama seperti $_GET, variabel $_POST juga berbentuk associative array dan bersifat global yang artinya dapat diakses dimana saja, selain itu juga dapat dilakukan manipulasi sebagaimana variabel array lainnya.
Penggunaan metode POST sering kita jumpai terutama pada saat pengiriman data menggunakan form html. Misal: meneruskan contoh sebelumnya, pada file registrasi.php kita ganti method pada bagian form dari get
menjadi post
<html>
<body>
<form method="POST" action="">
<input type="text" name="nama"><br>
<input type="text" name="email"><br>
<input type="submit" name="submit" value="submit">
</form>
<?php
if ($_POST)
{
echo 'Nama: ' . $_POST['nama'];
echo '<br>';
echo 'Email: ' . $_POST['email'];
}
?>
</body>
</html>
misal field kita isi dengan nama: Agus Prawoto Hadi dan Email: prawoto.hadi@gmail.com, ketika kita klik submit, maka browser akan mengirim request ke server dengan bentu seperti gambar dibawah ini:
dari gambar diatas terlihat data dikirim pada bagian body (kotak merah paling bawah) dan data yang dikirim diencode dengan sistem sama dengan GET (url encode) yang memang secara default cara pengiriman data pada POST adalah menggunakan application/x-www-form-urlencoded
, disamping itu juga ada multipart/form-data
yang digunakan untuk pengiriman data berupa file/binary.
POST yang dikirim via query string dan HTTP body
Sebelumnya telah kita singgung mengenai pengiriman POST melaui query string yang artinya akan ditampilkan pada URL.
Sering kita fahami bahwa semua yang ada di URL adalah GET, karena kita sering berinteraksi dengan variabel $_GET dan dalam praktek hal tersebut tidak pernah menjadi masalah, tidak akan ada error yang muncul.
Namun demikian sebenarnya yang terjadi tidaklah demikian, coba kita buka kembali file register.php dan kita ubah menjadi:
<html>
<body>
<form method="POST" action="?action=edit">
<input type="text" name="nama"><br>
<input type="text" name="email"><br>
<input type="submit" name="submit" value="submit">
</form>
<?php
if ($_POST)
{
echo '<pre>';
print_r($_GET);
print_r($_POST);
}
?>
</body>
</html>
misal kita isi dengan data yang sama dengan contoh sebelumnya, maka ketika kita klik submit, hasil yang kita peroleh adalah:
// $_GET
Array
(
[action] => edit
)
// $_POST
Array
(
[nama] => Agus Prawoto Hadi
[email] => prawoto.hadi@gmail.com
[submit] => submit
)
dan bentuk HTTP Requestnya seperti gambar dibawah ini:
dari gambar diatas terlihat bahwa metode yang kita gunakan adalah POST dan data dikirim dengan dua cara baik melalui query string maupun HTTP body. query string disimpan pada variabel $_GET dan HTTP body disimpan pada variabel $_POST
Kelebihan dan kekurangan
Pengiriman data menggunakan metode POST memiliki beberapa kelebihan diantaranya:
- Lebih aman dari pada metode GET karena data yang dikirim tidak terlihat, serta parameter yang dikirim tidak disimpan pada history browser/log browser.
- Dapat mengirim data dalam jumlah besar.
- Dapat mengirim berbagai jenis data seperti gambar, file, dll, tidak harus teks.
Meskipun terdapat kelebihan, penggunaan metode ini juga memiliki beberpa kelemahan, walaupun sebenarnya bukan kelemahan melainkan memang menjadi karakteristik dari metode ini:
- Data tidak disimpan pada history browser.
- Data tidak dapat dibookmark.
- Karena dianggap sebagai data sensitif, maka ketika kita merefresh browser, akan muncul konfirmasi pengiriman ulang data, demikian juga ketika kita tekan tombol back.
3. Kapan Menggunakan GET dan Kapan Menggunakan POST
Untuk memutuskan apakah kita akan menggunakan metode GET atau POST, kita harus selalu mengajukan pertanyaan: apakah akan terjadi perubahan pada server? jika ya, maka kita gunakan POST, jika tidak maka kita gunakan GET.
Contohnya adalah ketika membuat pagination, kita cukup menggunakan GET tidak perlu POST, bisa dibayangkan ketika kita sudah sampai halaman 5 suatu artikel, dan kita mau membookmarknya untuk dibaca di lain waktu, dan ternyata tidak bisa karena halaman tersebut mengunakan POST, dengan terpaksa kita harus membuka halaman 1 lagi!,
Begitu juga dengan sistem pencarian seperti pada google, bisa dibayangkan jika metode yang digunakan adalah POST.
Contoh lainnya adalah penggunaan ID untuk menghapus data, perhatikan url berikut: http://www.contoh.com/user.php?action=delete&id=1, url ini akan berbahaya jika hal ini benar-benar terjadi.
Kenapa?
Karena data user akan terhapus dengan begitu mudahnya, lain halnya jika ID tersebut digunakan hanya untuk menampilkan data seperti http://www.contoh.com/user.php?action=view&id=1.
singkatnya GET untuk READ data, POST untuk CREATE, UPDATE, DELETE data.
Pertanyaan kedua adalah apakah ada data sensitif yang dikirim? jika ya maka kita gunakan POST.
Contohnya adalah pengiriman username dan password ketika login, atau data keuangan seperti kartu kredit. Jika data tersebut dikirim via url maka jelas data tersebut akan terekspose kemana-mana terutama jika ter index oleh google. (Kecuali pada penggunaan AJAX).
4. $_REQUEST pada PHP
PHP menyediakan variabel global bernama $_REQUEST, variabel ini merupakan gabungan dari tiga variabel yaitu: $_GET, $_POST dan $_COOKIE. Karakteristik variabel ini sama dengan $_GET dan $_POST yaitu berbentuk associative array yang bersifat global dan dapat kita manipulasi seperti variabel array lainnya.
Dalam pembentukan variabel $_REQUEST, variabel yang menjadi prioritas adalah $_POST, sehingga jika antara $_GET dan $_POST terdapat key
yang sama, maka yang digunakan adalah data pada variabel $_POST, contoh mari kita ubah file register.php dengan menambahkan satu hidden field bernama action:
<html>
<body>
<form method="POST" action="?action=edit">
<input type="text" name="nama"><br>
<input type="text" name="email"><br>
<input type="hidden" name="action" value="insert">
<input type="submit" name="submit" value="submit">
</form>
<?php
if ($_POST)
{
echo '<pre>';
print_r($_GET);
print_r($_POST);
print_r($_REQUEST);
}
?>
</body>
</html>
seperti pada contoh sebelumnya, kita isikan nama: Agus Prawoto Hadi dan email: prawoto.hadi@gmail.com, ketika kita submit maka kita dapatkan hasil:
// $_GET
Array
(
[action] => edit
)
// $_POST
Array
(
[nama] => Agus Prawoto Hadi
[email] => prawoto.hadi@gmail.com
[action] => insert
[submit] => submit
)
// $_REQUEST
Array
(
[action] => insert
[nama] => Agus Prawoto Hadi
[email] => prawoto.hadi@gmail.com
[submit] => submit
)
dari contoh diatas terlihat bahwa nilai action yang digunakan adalah insert yang terdapat pada variabel $_POST
Saya pribadi jarang dan mungkin tidak pernah menggunakan variabel $_REQUEST karena akan menyulitkan dan membuat ambigu, tidak jelas dari mana datangnya data apakah dari inputan user atau dari url, terlebih jika program yang kita buat kompleks, dengan menggunakan $_GET atau $_POST masalah tersebut tidak akan terjadi.
Kesimpulan
GET dan POST merupakan metode yang digunakan protokol HTTP untuk pertukaran data.
Pada PHP, data yang dikirim menggunakan metode GET akan disimpan dalam variabel $_GET, sedangkan POST akan disimpan pada variabel $_POST (untuk data yang dikirim via url disimpan pada variabel $_GET).
Masing masing metode memiliki kelebihan dan kekurangan dan memang sebenarnya kedua metode tersebut ditujukan untuk keperluan berbeda, sehingga kita harus tahu kapan menggunakan GET dan kapan menggunakan POST.
PHP juga menyediakan variabel $_REQUEST yang merupakan gabungan dari variabel $_GET, $_POST dan $_COOKIE. Pada variabel ini tidak terlihat dari mana datangnya data apakah dari GET atau POST sehingga sebaiknya lebih berhati hati ketika menggunakan variabel ini.
Demikian pembahasan mengenai GET dan POST pada PHP dan HTTP semoga dapat bermanfaat.
Jangan lupa beritahu sobat yang lain:
Subscibe Now
Suka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com
32 Feedback dari pembaca
terima kasih infonya ..
Sama sama mas…
Bagus gan pencerahannya…
sekarang saya rubah teknik menghapus (delete) database tidak lagi menggunakan $_GET[], sangat berbahaya ternyata…
Iya mas, terima kasih…
Selamat siang mas agus, mohon bantuannya tekait proses input pada form security :
contoh input data
1. nama johny , tgl awal 2017-02-08 sampai tgl akhir 2017-02-14, shift pagi
2. nama robi , tgl awal 2017-02-15 sampai tgl akhir 2017-02-20, shift pagi
mohon bantuan proses input data supaya hasilnya seperti tabel tersebut
contohnya input hasilnya pada tabel :
Nama Tanggal Shift
Johny 2017-02-08 P
Johny 2017-02-09 P
Johny 2017-02-10 P
Johny 2017-02-11 P
Johny 2017-02-12 P
Johny 2017-02-13 P
Johny 2017-02-14 P
Robi 2017-02-15 P
Robi 2017-02-16 P
Robi 2017-02-17 P
Robi 2017-02-18 P
Robi 2017-02-19 P
Robi 2017-02-20 P
Terima kasih atas bantuannya,
Sukses selalu
Coba pakai acuan tanggal awal, terus ditambahkan berulang ulang 1 hari mas hingga mencapai tanggal akhir, gunakan fungsi
Hal ini untuk mengantisipasi perbedaan bulan dan tahun, misal tanggal awal 2016-12-30 tanggal akhir 2017-01-05
makasih mas, sukses selalu
sama sama mas…
saya ingin menampilkan record paling atas saja. saya sudah coba tapi selalu gagal.
contoh scriptnya :
1st
2nd
3rd
dimana kesalahannya?
Coba menggunakan ORDER BY nm_kolom DESC dan LIMIT mas
URL pada metode GET bisa diubah jadi angka tidak gan?
Maksudnya angka bagaimana mas? tapi seharusnya bisa…
Mas.. mhn pencerahan,,
kl ada kasus spt ini:
klik link domain http://www.namadomain.com/MJU123
trs di halaman website itu ada link aplikasi android misalnya whatsapp
link sebenarnya:
https://play.google.com/store/apps/details?id=com.whatsapp
krn dklik dr link awal di http://www.namadomain.com/MJU123
maka link aplikasi tdi berubah menjadi:
https://play.google.com/store/apps/details?id=com.whatsapp&referrer=MJU123
saya ga tau ini semacam refferal atau sekedar link apa ya..
jadi intinya bisa menambah akhiran di link berdasarkan link awal…
ada pencerahan ga?
terima kasih sebelumnya…
Itu tinggal pakai $_GET mas atau bisa gunakan variabel $_SERVER, coba cek print_r($_SERVER) ambil bagian MJU123 Kemudian tambahkan ke referrer
Thanks agan, ada pertanyaan saya untuk form regisgter mana yg lebih baik diginakan ? $_GET or $_POST
Tergantung kebutuhan mas, coba cek artikel diatas bagian “Kapan Menggunakan GET dan Kapan Menggunakan POST”
Assalamu’alaikum..
Mohon + pencerahan script untuk delete data dengan method post.
Sementara ini, script delete dg methode post saya seperti ini:
if (isset($_POST[‘del’]){
$id = $_POST[‘id’];
// script delete
}
//query bla bla
while (bla bla){
//$data[‘blabla’]
<input type="hidden" name="id" value="”>
Maturnuwun
Maksudnya bagaimana ya mas?
fitur back to top nya gak berfungsi.
Terima kasih masukannya mas, disaya berfungsi, apa mungkin halaman belum ke load semua
Terim kasih informasinya Pak. 🙂
Sama sama mas… 🙂
Terimakasih ilmunya pak. tapi jika boleh saya ada pertanyaan bagaimana ketika kasusnya
Dri front akan mengirimkan 2 object misalnya statusOtp dan status customer. Di Back end akan ada proses registrasi yang berjalan di background proses service. Setelah registrasi selesai FE akan mendapakan response success yang ada 2 tipe, yg akan mereka gunakan untuk handle user interface selanjutnya.
Jika prosesnya berjalan seperti itu lebih baik menggunakan methode post atau get di FE menurut bapa ?
Sebaiknya pakai POST mas, karena proses regiatrasi ya, sehingga akan ada data yang dimipulasi…
Mas ketika kita inspect element pada website yang menggunakan method POST itu cara melihat request body nya gimana ya? Cara normal nya sih klik network table terus klik edit&resend. Tapi masalahnya edit&resend nya diblock pake security.
Cara buat lihat request bodynya gimana ya?
Coba pakai firefox addon live http header mas…
mas Agus saya masih belajar, tapi masih jauh rasanya mau bikin web untuk jualan;
yang saya ingin tanyakan adakah mas Agus jual aplikasi jadi semisal katalog barang/harga yang seperti shopee tentu saja tidak sebagus itu lah, yang kira-kira saya menjangkau untuk membelinya,
Maaf untuk yang seperti itu belum ada mas…
Selamat pagi pak. Mau tanya. Untuk data yang dikirim dengan metode API apakah sama seperti metode get dan pos?
Sama mas, cuman nggambil datanya yang agak berbeda
Help gan, misalkan saya punya form di suatu page saya, nah di form itu ada kolom nama dan resi. yang saya mau, ketika orang ngisi form tersebut, misal
nama : Andi
Resi : SUB423248
nah, ketika diklik submit atau kirim, bisakah di redirect ke wa, tapi custom teks wa nya pake data form yg diisi tadi itu,, jadi gini contoh hasilnya http://wa.me/623185*****?text=Andi dan SUB423248
bisakah
Bisa mas tinggal diubah attribute action pada form nya