POST dan GET pada form PHP

Form adalah elemen HTML untuk mengirim data ke server. Untuk detail mengenai elemen form dan elemen input pada HTML, dapat mengunjungi halaman form pada html dan elemen input pada html. Anda juga mungkin perlu melihat tabel HTML.

Topik kali ini tidak akan membahas terlalu mendetil mengenai elemen form dan input HTML, dan lebih banyak membahas penerimaan data form pada sisi server dengan PHP. Langsung saja, berikut contoh scriptnya.

<!doctype html>
<html>
  <head>
    <title>Coba Form</title>
    <style>
      table{background: #FB7;}
      table td{padding: 2px; margin: 2px; background: #FFC;}
      table tr:nth-child(odd) td {background: #FFA;}
    </style>
  </head>
  <body>
    <!--action kosong berarti mengirim ke diri sendiri-->
    <form method="POST" action="">
      <table>
        <tr>
          <td>Nama</td>
          <td><input type="text" name="nama" /></td>
        </tr>
        <tr>
          <td>Password</td>
          <td><input type="password" name="password" /></td>
        </tr>
        <tr>
          <td>E-mail</td>
          <td><input type="email" name="email" required /></td>
        </tr>
        <tr>
          <td>Website</td>
          <td><input type="url" name="web" required /></td>
        </tr>
        <tr>
          <td>Jenis Kelamin</td>
          <td><input type="radio" name="kelamin" value="Laki-laki"/>Laki-laki <input type="radio" name="kelamin" value="Perempuan" />Perempuan</td>
        </tr>
        <tr>
          <td>Umur</td>
          <td><input type="number" name="umur"/></td>
        </tr>
        <tr>
          <td>Tanggal Lahir</td>
          <td><input type="date" name="lahir"/></td>
        </tr>
        <tr>
          <td>Hobi</td>
          <td>
            <input type="checkbox" name="hobi[]" value="Gaming"/>Main game<br />
            <input type="checkbox" name="hobi[]" value="Movies" />Nonton<br />
            <input type="checkbox" name="hobi[]" value="Cooking" />Memasak<br />
            <input type="checkbox" name="hobi[]" value="Gardening" />Berkebun<br />
            <input type="checkbox" name="hobi[]" value="Writing" />Menulis<br />
          </td>
        </tr>
        <tr>
          <td>Warna kesukaan</td>
          <td><input type="color" name="warna" /></td>
        </tr>
        <tr>
          <td>Golongan</td>
          <td>
            <select name="golongan">
              <option value="">--Golongan--</option>
              <option value="mahasiswa">Mahasiswa</option>
              <option value="dosen">Dosen</option>
              <option value="staff">Staff / Karyawan</option>
              <option value="umum">Umum</option>
            </select>
          </td>
        </tr>
        <tr>
          <td>Lomba yang diikuti:</td>
          <td>Boleh pilih lebih dari satu<br />
            <select name="lomba[]" multiple>
              <option value="kerupuk">Makan kerupuk</option>
              <option value="pinang">Panjat pinang</option>
              <option value="catur">Catur</option>
              <option value="karung">Balap Karung</option>
              <option value="kelereng">Sendok Kelereng</option>
            </select>
          </td>
        </tr>
        <tr>
          <td colspan="2">
            Penjelasan lebih lanjut mengenai diri Anda:<br />
            <textarea name="keterangan"></textarea>
          </td>
        </tr>
        <tr>
          <td colspan="2"><button name="kirim">Daftar</button></td>
        </tr>
      </table>
      <input type="hidden" name="tersembunyi" value="Kode sesi: ABC DEF XYZ 123 789"/>
    </form>
    <hr />
    Data yang terkirim: <pre><?php print_r($_POST);?></pre>
  </body>
</html>

Untuk mempelajari kode di atas, paling baik bila Anda mencoba menjalankannya. Copy paste kode di atas ke sebuah file .php, misalnya form.php. Kemudian jalankan dan coba input data ke dalam form yang muncul.

Perlu dijelaskan juga di sini bahwa:

  1. hobi[] dan lomba[] merupakan array karena diakhiri dengan tanda []. Array adalah tipe data PHP yang dapat menampung banyak data sekaligus.
  2. print_r() adalah fungsi yang menjabarkan isi suatu variabel. Biasanya variabel array atau objek.
  3. $_POST, bersama-sama dengan $_GET, $_REQUEST, $_SERVER, $_COOKIE, $_FILES, $_SESSION, $_ENV adalah variabel-variabel yang disebut superglobals. Yaitu adalah variabel yang selalu tersedia dan dapat diakses tidak peduli lingkup variabel seperti apapun.

Method POST pada form PHP

Kode di atas pengiriman datanya menggunakan metode POST. Metode ini sering dipakai pada form pendaftaran online, login, pembayaran online, form buku tamu dan sebagainya. Sifat dari metode ini adalah:

  1. Datanya tidak terlihat kasat mata.
  2. Bila halaman yang menerima kiriman data direfresh atau dikunjungi kembali dengan tombol back. Akan muncul peringatan "form resubmission". Yaitu pengiriman ulang data.
  3. Bisa menampung data lebih banyak dibanding metode GET
  4. Bisa digunakan juga untuk mengirim file (dibahas di topik lain).
  5. Pada PHP diambil dengan $_POST

Sifat nomor 2 di atas dapat dicegah dengan metode penggunaan ajax. Penggunaan ajax akan dibahas pada topik terpisah.

Metoda POST sudah lebih baik dari segi keamanan dibanding metoda GET. Akan tetapi keamanan metoda POST dapat lebih ditingkatkan lagi dengan https atau ssh.

Method GET pada form PHP

Selain metode POST, terdapat metode GET. Metode ini biasanya dipakai pada form pencarian atau sebagai navigasi halaman web. Sifat dari metode ini adalah:

  1. Data yang dikirim terpampang pada URL, dan dapat diedit lewat URL
  2. Bila halaman yang menerima kirim data direfresh, maka data otomatis terkirim kembali tanpa peringatan
  3. Pada beberapa browser, ukuran data GET terbatas oleh jumlah karakter maksimal pada URL (255 bytes)
  4. Tidak dapat mengirim gambar
  5. Pada PHP diambil dengan $_GET

Method GET sebaiknya tidak dianggap sebagai suatu cara untuk mengirim data pada form. Method GET lebih baik digunakan sebagai suatu alamat web. Seperti misalnya alamat https://www.google.co.id/search?q=belajar+C+sharp&start=30 akan membawa kita ke google langsung dengan kata kunci "belajar C sharp", dimulai dari record ke 30 (halaman 4).

Kita dapat mengedit pencarian kita pada google dengan mengedit URL. Akan tetapi tentunya lebih mudah bagi kita untuk mengetikkan pencarian kita lewat textbox pencarian pada halaman google.

Website dahulu kala pernah menggunakan get sebagai pengarah halamannya. Misalkan http://localhost/index.php?a=buku akan masuk ke halaman buku. http://localhost/index.php?a=member akan masuk ke halaman member dan seterusnya. Saat ini cara seperti itu sudah dipercantik (dan diperumit) dengan penggunaan file .htaccess.

Format dari metode GET pada URL adalah:

  1. Dimulai dengan tanda tanya (?)
  2. Tiap field dipisahkan dengan tanda ampersand (&)
  3. Untuk karakter-karakter khusus misalnya spasi, menggunakan pengkodean URL. Spasi akan menjadi %20. Tanda sama dengan (=) akan menjadi %3D.

Contoh:

<!doctype html>
<html>
  <head>
    <title>Coba GET</title>
    <!--Menggunakan font-awesome biar tombol cari bisa lebih keren-->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
  </head>
  <body>
    <!--action kosong berarti mengirim ke diri sendiri-->
    <form method="GET" action="">
      Cari: <input type="text" name="katakunci"/>
      Harga Min <input type="number" name="min" />
      Harga Max <input type="number" name="max"/>
      <button name="cari"><i class="fa fa-search"></i></button>
    </form>
    <hr />
    Data yang terkirim: <pre><?php print_r($_GET);?></pre>
  </body>
</html>

Perhatikan bahwa pada kode di atas, elemen form menggunakan atribut method="GET". Dan juga pada fungsi print_r di bagian bawah, variabel yang dikirim ke fungsi print_r adalah variabel $_GET.

Kode di atas juga sedikit memanfaatkan library font-awesome untuk memunculkan ikon kaca pembesar pada tombol cari.

Peringatan: JANGAN menggunakan method GET untuk form pendaftaran, form login atau form dengan informasi sensitif lainnya.

$_REQUEST pada PHP

Selain menggunakan $_POST dan $_GET data post dan get juga dapat diambil dengan $_REQUEST. $_REQUEST berisi gabungan data $_GET dan $_POST.

Meski terlihat efisien dan memudahkan, disarankan untuk TIDAK menggunakan $_REQUEST karena merupakan suatu celah keamanan. Bila script menggunakan $_REQUEST di dalamnya, maka pengguna aplikasi web dapat menyisipkan data POST melalui URL kapan saja dia mau.

Demikian sekilas mengenai pengiriman data form pada PHP beserta sekilas keamanannya. Semoga bermanfaat.