Bagaimana $_POST dan $_GET terhasil


Posted:   |   Read in English   |  More posts about php

Dalam PHP, $_POST dan $_GET adalah 2 bentuk input yang biasa digunakan oleh developer. $_GET mengandungi data daripada url query string manakala $_POST biasanya mengandungi data yang dihantar melalui html form. Tapi bagaimanakah data ini terhasil ?

Data untuk $_GET dan $_POST kedua-duanya dihasilkan dengan memproses HTTP request yang dihantar oleh client. Secara ringkas, HTTP request adalah dalam bentuk teks dengan format seperti berikut:-

GET /index.php?action=list&module=user HTTP/1.1
Content-Type: text/html
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.

Atau:-

POST /index.php HTTP/1.1
Content-Type: application/x-www-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.

username=kamal&address=jb

HTTP request ini terbahagi kepada 3 bahagian iaitu Request line, Headers dan Body. Untuk GET request bagaimana pun, tiada bahagian Body yang dihantar dalam request tersebut. Data ini dihantar dalam bentuk teks ke socket di mana web server yang mengendalikan request ini listen. PHP biasanya menggunakan Apache sebagai web server dan apache biasanya akan listen pada port 80.

Setelah diterima oleh web server, data tersebut akan dipass ke PHP yang seterusnya akan memproses data tersebut (parsing) untuk dimasukkan ke dalam superglobal variables seperti $_POST, $_GET dan lain-lain. Bagaimana proses tersebut dilakukan adalah adalah agak kompleks dengan beberapa lapis kod C tetapi secara asasnya adalah seperti berikut:-

  • $_GET dihasilkan daripada Request line - GET /index.php?action=list&module=user HTTP/1.1

    • Secara mudahnya kita boleh split kepada 3 bahagian - ['GET', '/index.php?action=list&module=user', 'HTTP/1.1']
    • Kemudian kita boleh parse bahagian kedua berdasarkan simbol '?' dan '&' untuk mendapatkan data yang dikehendaki.
  • $_POST dihasilkan daripada Body jadi kita boleh terus split data tersebut berdasarkan simbol '&'.

PHP bagaimana pun hanya memproses POST data dalam bentuk application/x-www-urlencoded untuk dimasukkan ke dalam superglobal $_POST. Ini mungkin kerana browser hanya terhad untuk menghantar data dalam format tersebut (selain multipart/form-data untuk upload file) maka PHP tidak memproses data dalam format yang lain. Tetapi jika anda menghantar data menggunakan client HTTP selain browser, ataupun menggunakan XMLHttpRequest (AJAX), anda mungkin menghantar dalam bentuk JSON (application/json) atau XML (application/xml). Dalam kes ini anda boleh mengakses terus input stream PHP seperti berikut:-

$data_json = json_decode(file_get_contents('php://input'));

Jika request kita adalah seperti berikut:-

POST /index.php HTTP/1.1
Content-Type: application/json
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.

{"username": "kamal", "address": "jb"}

php://input akan return JSON pada bahagian body.

Ini adalah penerangan dalam bentuk yang amat ringkas bagaimana input untuk PHP dihasilkan. Saya akan cuba kembangkan topik ini dalam tulisan akan datang.

Comments powered by Disqus

About me

Web developer in Malaysia. Currently work at MARIMORE Inc building internet services using Python and Django web framework.

ImportError is an error message emitted by Python when it failed to load certain module as requested by programmer. It's a very common error when someone new to the language trying it out. This website on the same theme, will try provide help for newcomers on any technologies to overcome their first hurdle.

Try most of the examples you may find here on Digital Ocean cloud service. They provide excellent VPS at a very cheaper price. Using this referral link you'll get USD10 credits upon sign up. That's enough to run single VPS with 1GB RAM for a month.

Others

I can also be found at the following sites:-

  • http://k4ml.blogspot.com/
  • http://k4ml.github.io/
  • http://metak4ml.blogspot.com/
  • http://www.mydev.my/
  • http://github.com/k4ml/

Disclaimers

The postings on this site are my own and don't necessarily represent my employer's positions, strategies or opinions.

Share